gpt4 book ai didi

C++ 私有(private)嵌套抽象类

转载 作者:可可西里 更新时间:2023-11-01 18:38:47 25 4
gpt4 key购买 nike

所以也许这是一个愚蠢的问题,我想太多了,但我遇到了以下情况。我正在制作一个可以运行抽象“类 Action ”对象的“类外壳”。它是唯一应该创建或使用这些对象的类。操作对象需要访问 Shell 才能对其执行特定操作,但我试图避免为此添加公共(public)接口(interface)(不应允许其他任何人这样做)。

我本来有一个简单的(不太优雅)

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,但我想将其设为私有(private)(为什么要让除 Shell 之外的任何其他人制作具体的 Action,对吗?)

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 继承(这是有道理的,它是私有(private)的)。所以那是行不通的。

所以我的问题是,我应该只使用第一种方法和友元还是公共(public)接口(interface)?我可以使用类似于第二种方法的方法来保持与 Actions 和 Shell 的关系吗?你有更好的主意吗?

最佳答案

如果唯一需要能够看到 Action 的代码是 Shell,一种选择是在头文件,但只在 .cpp 文件中定义类。这样一来,您就可以在实现文件中声明任意数量的 Action 子类,而不会让任何其他人从 Action 中继承子类,因为没有其他人拥有完整的类Action 的定义。这也避免了对公共(public)接口(interface)或 friend 声明的任何需要 - 所有 Action 类都在全局范围内声明,但由于在 . .cpp 文件。

顺便提一下,这是个好问题!

关于C++ 私有(private)嵌套抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com