当前位置:  开发笔记 > 编程语言 > 正文

C++嵌套类让我发疯

如何解决《C++嵌套类让我发疯》经验,为你挑选了3个好方法。

我正在尝试编译这段非常简单的代码

class myList
{
public:
    std::vector vec;
    class Items
    {
    public:
        void Add(std::string str)
        {
            myList::vec.push_back(str);
        };
    }items;
};

int main()
{
    myList newList;
    newList.items.Add("A");
}

如果不创造更多需要或过于复杂的东西,我该怎么做才能完成这项工作......



1> richq..:

添加几个构造函数和指向父类的指针.

#include 
#include 
class myList
{
public:
    std::vector vec;
    myList(): items(this) {} // Added
    class Items
    {
    public:
        Items(myList *ml): self(ml) {}  // Added
        void Add(std::string str)
        {
                self->vec.push_back(str); // Changed
        };
        myList *self; //Added
    }items;
};

int main()
{
    myList newList;
    newList.items.Add("A");
}

您需要myList()构造函数,因此它使用内部类成员变量的实例注册自身的实例.然后,您需要Items构造函数来存储指向外部myList类实例的指针.最后在Add方法中,您需要在存储的myList实例中引用vec.

正如Catskul指出的那样,Item构造函数实际上不能对它接收的myList指针做任何事情.我还想说,尽管这个答案更接近原始意图,但steveth45的答案更接近于你想要在真实程序中做什么.



2> postfuturist..:

这样您就不会直接暴露您的班级成员.您的示例似乎过度架构了一下.为什么将std :: vector放入类中然后将其公开为public?

class myList
{
private:
    std::vector vec;
public:
    void Add(std::string str)
    {
        vec.push_back(str);
    };
};

int main()
{
    myList newList;
    newList.Add("A");
}


原作者可能需要内部类构造用于他未提及的其他内容(为了简化他的阐述).鉴于现有信息,你对软件工程软方面的看法是对的,但问题似乎是一个"玩具"抽象编译问题原本可能是一个非常复杂的算法.这真的不重要,你可能已经理解了,我只是说......

3> Rob Walker..:

与Java不同,C++中的内部对象无法访问外部"this"指针......如果您考虑它,可能会出现无法引用的情况.

Richard Quirk的解决方案是您可以在C++中获得的解决方案

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有