继承 - 如何根据类设置静态变量?

zna*_*nat 2 c++

我有一个带有静态变量的类层次结构:

class Shape{
public:
    static string name;
}

class Rectangle: public Shape{

}
Run Code Online (Sandbox Code Playgroud)

我想name根据班级设定.所以Shape::name应该是"形状",Rectangle::name应该是"矩形"

我所做的是初始化每个.cpp实现文件中的静态变量.所以在Shape.cpp中:

string Shape::name = "Shape";
Run Code Online (Sandbox Code Playgroud)

在Rectangle.cpp中:

string Shape::name = "Rectangle";
Run Code Online (Sandbox Code Playgroud)

链接器不喜欢这样,并抱怨有一个重复的符号.那我怎么能实现呢?

注意:我想坚持使用初始化列表的构造函数(在.cpp中没有实现)

bob*_*obo 6

你要做的事永远不会奏效.一个static变量只能有一个声明,其中分配一个值,而不是两个独立的人在不同的文件,你都试过了.您尝试做的有点类似于尝试使用两个不同的函数体来阻止相同的函数头.将无法工作,并且不应该工作,重复符号错误.

要使它工作,您需要在类中调用另一个静态变量.派生类变量隐藏基类中的变量.nameRectanglenamenameShape

然后你会使用:

string Rectangle::name="Rectangle"
Run Code Online (Sandbox Code Playgroud)

如果不相信,试试这个

#include <stdio.h>
#include <string>
using namespace std ;
struct Base 
{
  static string name ;

  Base(){
    printf( "Base: A %s was created\n", name.c_str() ) ;
  }
} ;

string Base::name="Base";

struct Derived
{
  static string name ;

  Derived(){
    printf( "Derived: A %s was created\n", name.c_str() ) ;
  }
} ;

string Derived::name="Derived";



int main(int argc, const char * argv[])
{
  Base b ;
  Derived d;
}
Run Code Online (Sandbox Code Playgroud)