2016-11-08 153 views
0

考虑派生A类和BaseB类的Base类。从BaseB导出C类。所有类都继承非静态变量“y”,但在BaseB和C类中,“y”具有相同的值。 我解决了这个情况用下面的代码:将静态变量分配给非静态变量

class Base { 
    protected: 
     int y; 
    virtual void registerValue() 
     { 
     y = 5; 
     } 

}; 

class A : public Base { 
}; 

class BaseB : public Base { 
    protected: 
    static int x; 
     virtual void registerValue() 
     { 
      // Process x ... 
      y = x; 
     } 

}; 

class C : public BaseB { 

}; 

int BaseB::x = 3; 

int main() {} 

它的工作原理,但它是正确的静态变量分配给非静态变量这种情况?

+0

我不明白为什么它不会。它是对静态变量*的分配,您必须注意(并发问题等) – Medinoc

+0

“所有类都继承非静态变量”y“,但在BaseB和C类中,”y“具有相同的价值“ - 好吧,它们都具有相同的Y值;除了有时您将其设置为不同的值。即。如果你打电话给'B或C :: registerValue',你最终会改变A的值,这可能不是你想要的。 – UKMonkey

+0

UKMonkey考虑到A类用自己的成员y生成其他实例。 – Ruben

回答

2

从语言合法性的角度来看,这很好,但有点奇怪。

大概你不能让Base::ystatic因为这会干扰类A的行为?

你只需要知道BaseB的实例都将共享相同的x,但可能有不同的值y。这是预期的行为?

个人而言,我会考虑做void registerValue()纯虚函数的基类,并期待所有派生类实现一个方法,包括其实施所有必要的存储。也许这也需要基类功能virtual int getRegistedValue() = 0呢?

+0

是Bathsheba我无法使Base :: y静态,因为在A类的情况下,“y”变量是不同的。用静态x确保x对于类BaseB和C是相同的,因此我们将在这些类中具有相同的y值 – Ruben

+0

对于实现并不需要实现virtual int getRegistedValue()= 0。 – Ruben