Как сделать переменную вложенного класса статической для каждого экземпляра родительского класса?

Например, в следующем примере я хотел бы иметь возможность установить x.nest1.n а также y.nest1.n к разным ценностям, но сила x.nest1.n === x.nest2.n а также 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   :(

3 ответа

Решение

Это звучит как n является собственностью Aне 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 ) {}
};

Вы не можете сделать это с помощью 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) { ... }
};
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;
};
Другие вопросы по тегам