我对 C++ 比较陌生,为此我寻找了很多答案,但从未得到满意的答案。
假设我有一个名为 FSM
的结构。最终在我的代码中,可以创建多个 FSM
实例。 FSM
的属性之一是 int X
,它不是静态的,FSM
的每个实例都应该有自己的 X< 值
。
现在,FSM
的属性之一是另一个结构submachine
,它需要像这样读取X
的值:
struct FSM
{
public:
int x;
int getX(){return x;}
struct submachine
{
void onentry() {int g = getX();};
};
};
这会产生以下错误:
Error: 'FSM::getX' : illegal call of non-static member function
我的问题是,submachine
是 FSM
的成员,所以它不应该可以访问 FSM
的所有属性的本地实例吗>?如果不是,当我们创建 FSM
的实例时,我们不会创建其所有成员的实例,即 submachine
吗?如果是这样,那为什么我们需要创建 onentry()
需要的对象?
我假设编译器是正确的,所以我也想知道是否有办法让它工作。
注意:不幸的是,内部结构的实例(submachine
)在调用事件时被实例化,因此我只能定义类型,而不能在 FSM 中为它们实例化对象
.
最佳答案
my question is, submachine is a member of FSM, so it should have access to local instances of all the attributes of FSM, no?
没有。与 Java 不同,内部类对象没有对外部对象的隐式引用。
wouldn't we be creating an intance of all its members i.e. submachine?
submachine
是 type,而不是成员变量。如果你想要一个成员变量,你必须这样做:
struct FSM {
struct submachine {
...
};
submachine sm; // Member variable of type submchine
};
如果你想让 sm
“看到”它的父对象,你需要明确地传递它:
struct FSM {
struct submachine {
FSM &parent; // Reference to parent
submachine(FSM &f) : parent(f) {} // Initialise reference in constructor
};
submachine sm;
FSM() : sm(*this) {} // Pass reference to ourself when initialising sm
};
请注意,同样的原则也适用于不是成员变量的 submachine
实例。如果您希望他们能够访问 FSM
实例,则需要传递对实例的引用。
还请注意,您可以使用指针而不是引用。事实上,指针在许多情况下提供了更大的灵 active 。
关于c++ - 内部类访问外部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11405069/