Как сделать переменную вложенного класса статической для каждого экземпляра родительского класса?
Например, в следующем примере я хотел бы иметь возможность установить 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;
};