Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使嵌套类的变量对于父类的每个实例都是静态的?_C++_Class_Static Members - Fatal编程技术网

C++ 如何使嵌套类的变量对于父类的每个实例都是静态的?

C++ 如何使嵌套类的变量对于父类的每个实例都是静态的?,c++,class,static-members,C++,Class,Static Members,例如,在下面的示例中,我希望能够将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.ne

例如,在下面的示例中,我希望能够将
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   :(
结构A{ ... 结构B{ 静态int n; ... }; B)1; B.2; }; int A::B::n=0; ... A x,y; x、 nest1.n=1; y、 nest1.n=2;//希望能够从x.nest1.n单独设置
std::cout听起来好像
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
使用):


n
成为
a
的静态成员,我想你已经得到了它。@MattPhillips不,他希望它在不同的实例中有不同的值<代码>静态不适用。谢谢。如果我在<代码>中创建了大量的<代码> B/C++ >对象> A/<代码>成员函数…那么,我必须开始手动传递参数,每次当<代码> B/COD>对象被实例化时。@ MiloChen Yep,您需要传递一个参数,因为C++没有机制来限制函数可以调用的位置。由于
B::B()
理论上可能会从
a
的非静态成员之外的某个地方调用,因此无法将调用
作为隐式参数。但是,您可以使用成员工厂函数
ba::makeB()
隐藏(封装)参数。抱歉-
x.nest1.n
-拼写错误-修复
struct A {
    ...
    int n;
    struct B {
        ...
    };
    B nest1;
    B nest2;
};
struct A {
    ...
    int n;
    struct B {
        A& parent;

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

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