C++嵌套类让我发疯

SMe*_*ers 12 c++ nested class

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

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

int main()
{
    myList newList;
    newList.items.Add("A");
}
Run Code Online (Sandbox Code Playgroud)

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

ric*_*chq 15

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

#include <string>
#include <vector>
class myList
{
public:
    std::vector<std::string> 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");
}
Run Code Online (Sandbox Code Playgroud)

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

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


pos*_*ist 11

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

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

int main()
{
    myList newList;
    newList.Add("A");
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ker 5

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

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