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