This question already has answers here:
Inner Class access to Outer Class members

(5个答案)


5年前关闭。




我是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();};
    };
};

这给出了以下错误:



我的问题是,submachineFSM的成员,所以它不应该访问FSM所有属性的本地实例吗?如果不是,那么当我们创建FSM的实例时,是否会创建其所有成员(即submachine)的实例?如果是这样,那么为什么我们需要创建onentry()所需的对象?

我假设编译器是正确的,所以我也想知道是否有办法使它工作。

注意:不幸的是,调用事件时会实例化内部结构的实例(submachine),因此我只能定义类型,而不能在FSM中实例化对象。

最佳答案



不。与Java不同,内部类对象没有对外部对象的隐式引用。


submachine是类型,而不是成员变量。如果需要成员变量,则必须执行以下操作:

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实例,则需要将引用传递给一个实例。

还要注意,您可以使用指针而不是引用。实际上,在许多情况下,指针可提供更大的灵活性。

关于c++ - 内部类访问外部类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11405069/

10-09 04:10