【问题标题】:How to make variable of nested class static for each instance of parent class?如何使每个父类实例的嵌套类变量静态?
【发布时间】:2013-05-16 00:26:08
【问题描述】:

例如在以下示例中,我希望能够将x.nest1.ny.nest1.n 设置为不同 值,但强制x.nest1.n === x.nest2.ny.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   :(

【问题讨论】:

  • 道歉 - x.nest1.n - 错字 - 已修复

标签: c++ class static-members


【解决方案1】:

听起来nA 的属性,而不是B。你应该给B一个成员referencen或其父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 ) {}
};

【讨论】:

  • 使 n 成为 A 的静态成员,我想你已经明白了。
  • @MattPhillips 不,他希望它对不同的实例具有不同的值。 static 不适用。
  • 谢谢。如果我在A 的成员函数中创建大量B 对象,这似乎有点痛苦......
  • 那么我必须在每次实例化B 对象时手动传递参数。
  • @MiloChen 是的,您需要传递一个参数,因为 C++ 没有机制来限制可以调用函数的位置。因为理论上B::B() 可能会从A 的非静态成员之外的某个地方调用,所以无法将调用this 作为隐式参数。但是,您可以使用成员工厂函数 B A::makeB() 来隐藏(封装)参数。
【解决方案2】:

您不能使用 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) { ... }
};

【讨论】:

    【解决方案3】:
    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;
    };
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多