C++私有嵌套抽象类

Mat*_*att 7 c++ inheritance friend nested-class

所以也许这是一个愚蠢的问题,我在想这个,但我有以下情况.我正在制作一个"类Shell",它可以运行抽象的"类Action"对象.它是唯一应该创建或使用这些对象的类.操作对象需要访问Shell以对其执行特定操作,但我试图避免为此添加公共接口(不应该允许其他人这样做).

我原来有一个简单的(不那么优雅)

class Shell
{
 public:
    bool checkThing();
    // etc...
 private:
    bool _thing;
};

class Action
{
 public:
    virtual void execute( Shell &s )=0;
};

class ChangeAction : public Action
{
 public:
    void execute( Shell &s )
    {
        // requires friendship or public mutator!
        s._thing = true;
    }
};
Run Code Online (Sandbox Code Playgroud)

所以我考虑了一个嵌套类Action,但是我想把它变成私有的(为什么让其他人做除了Shell之外的具体动作,对吧?)

class Shell
{
 public:
    bool checkThing();
    // etc...
 private:
    bool _thing;
    class Action;
};

class Shell::Action
{
 public:
    virtual void execute( Shell &s )=0;
};

class ChangeAction : public Shell::Action
{
 public:
    void execute( Shell &s )
    {
        // ok now!
        s._thing = true;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是我当然不能继续从Action继承(这是有道理的,它是私有的).所以这不起作用.

所以我的问题是,我应该选择第一种方法和友情还是公共界面?我可以使用类似于第二种方法的东西来保持与Actions和Shell的关系吗?你有更好的主意吗?

tem*_*def 4

如果唯一需要看到的代码ActionShell,一种选择是Action在头文件中前向声明,但仅在 .cpp 文件中定义类。然后,这将允许您Action在实现文件中声明任意数量的子类,而不会让任何其他人子类化Action,因为没有其他人拥有Action. 这也避免了对公共接口或friend声明的任何需要 - 所有Action类都在全局范围内声明,但通过在 .cpp 文件中声明而与其他文件屏蔽。

顺便说一句,好问题!