C ++私有嵌套抽象类

所以也许这是一个愚蠢的问题,我正在想这个,但我有以下情况。 我正在制作一个“类Shell”,它可以运行抽象的“class Action”对象。 它是唯一应该创建或使用这些对象的类。 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;
    }
};

所以我考虑了一个嵌套的类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;
    }
};

但我当然不能从Action继承(这是有道理的,它是私有的)。 所以这是行不通的。

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


如果需要能够看到Action的唯一代码是Shell ,则一个选项是在头文件中转发声明Action ,但仅在.cpp文件中定义该类。 然后这可以让你在实现文件中声明尽可能多的Action子类,而不让其他任何人从Action派生出子类,因为没有其他人会有Action的完整类定义。 这也避免了对公共接口或friend声明的任何需求 - 所有的Action类都在全局范围内声明,但由于在.cpp文件中声明而与其他文件隔离。

顺便提一下,很好的问题!


您可以使用这些方法的组合:基本上只需从第一个方法中取出所有类并将它们移动到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 )
        {
            // ok now!         s._thing = true;
        }
    }; 

};
链接地址: http://www.djcxy.com/p/4763.html

上一篇: C++ Private Nested Abstract Class

下一篇: How to initialize HashSet values by construction?