gpt4 book ai didi

c++ - 子类的静态成员变量

转载 作者:行者123 更新时间:2023-11-30 00:42:30 25 4
gpt4 key购买 nike

是否可以在基类中定义一个静态成员变量,并让多个派生类各自使用该成员变量的实例?

下面的代码编译成功,并打印出正确的输出,但我仍然不确定这样做是不是一个好习惯。 在下面的示例中,如果我只显式定义 s 的一个实例(通过调用:string A::s;)但我实际上使用了 2 个实例,它会如何工作?

class A 
{
protected:
void SetS(string new_s){s = new_s;}
void PrintS(){cout << s << endl;};
private:
static string s;

};

class B : public A
{
public:
void foo(){ SetS("bbb"); PrintS();};
};

class C : public A
{
public:
void foo(){ SetS("ccc"); PrintS();};
};

string A::s;

int main()
{
B b;
b.foo(); // results in output: bbb
C c;
c.foo(); // results in output: ccc
b.foo(); // results in output: bbb
}

最佳答案

确实是一种非常奇怪的继承用法。基类应该理想地定义接口(interface),并且根据良好的 OO 设计原则,如果可能的话,应该包含尽可能少的状态或根本不包含状态。

这是有效的,因为你的 foo() 每次被调用时都会重置 A::s 的值。尝试打印 A::s 的地址。只有一个对象。如果您不是每次都设置该值并且您有多个对象使用另一个成员函数 bar() 来读取 A::s 的值,这将不起作用。

如果 BC 对象也在不同的线程中创建,您可能会遇到同步问题。你最终会得到 UB。

关于c++ - 子类的静态成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/599640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com