2

たとえば、次の例では、x.nest1.nandy.nest1.n異なる値に設定できるようにしたいのですが、強制的x.nest1.n === x.nest2.nに and y.nest1.n === y.nest2.n- これを達成するにはどうすればよいですか?

struct A {
    ...
    struct B {
        static int n;
        ...
    };
    B nest1;
    B nest2;
};
int A::B::n = 0;
...
A x, y;
x.nest1.n = 1;
y.nest1.n = 2;            // want to be able to set seperately from x.nest1.n
std::cout << x.nest1.n;   // prints 2   :(
4

3 に答える 3

4

ではなくnのプロパティのように聞こえます。いずれかまたはその親へのメンバー参照を与える必要があります。ABBnA

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 ) {}
};
于 2013-05-16T00:34:25.223 に答える
1

定義上、クラスのすべてのstaticインスタンスが静的メンバーを共有するため、変数を使用してこれを行うことはできません。static

回避策は、非静的メンバー変数として移動することB::nです。A

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

メソッドからこの変数にアクセスする必要がある場合 (私が想定しているように) B、通常の解決策は、各Bインスタンスにその親への参照/ポインターを格納することです (少なくとも、から独立して使用できるn場合はその親の変数へ):BA

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

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

    A() : nest1(*this), nest2(*this) { ... }
};
于 2013-05-16T00:35:21.407 に答える
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;
};
于 2013-05-16T00:33:20.337 に答える