如何为父类的每个实例创建嵌套类的变量static?

时间:2013-05-16 00:26:08

标签: c++ class static-members

例如,在以下示例中,我希望能够将x.nest1.ny.nest1.n设置为不同的值,但强制x.nest1.n === x.nest2.n和{{ 1}} - 如何实现这个目标?

y.nest1.n === y.nest2.n

3 个答案:

答案 0 :(得分:4)

听起来nA的属性,而不是B。您应该将B成员参考提供给n或其父A

struct A {
    struct B {
        int &n;
        B( int &in_n ) : n( in_n ) {}
    };

    int n;
    B nest1;
    B nest2;

    A::A() : n( 5 ), nest1( n ), nest2( n ) {}
};

答案 1 :(得分:1)

您无法使用static变量执行此操作,因为根据定义,static表示类的所有实例共享静态成员。

解决方法是将B::n移动到A作为非静态成员变量:

struct A {
    ...
    int n;
    struct B {
        ...
    };
    B nest1;
    B nest2;
};

如果(我假设)您需要从B方法访问此变量,那么通常的解决方案是在每个B实例中存储一个指向其父级的引用/指针(或者在如果n可以独立于B使用,则至少应为其父级A变量:

struct A {
    ...
    int n;
    struct B {
        A& parent;

        B(A& parent_) : parent(parent_) { ... }
        ...
    };
    B nest1;
    B nest2;

    A() : nest1(*this), nest2(*this) { ... }
};

答案 2 :(得分:0)

struct A {
    ...
    struct B {
        int n;
        ...
    };

    void setN(int n) {
        nest1.n = n;
        nest2.n = n;
    }

    B const& getNest1() const
    { return nest1; }

    B const& getNest2() const
    { return nest2; }

private:
    B nest1;
    B nest2;
};