我有一个带有静态变量的类层次结构:
class Shape{
public:
static string name;
}
class Rectangle: public Shape{
}
我想根据班级设置name
。因此Shape::name
应为“形状”,Rectangle::name
应为“矩形”
我所做的是初始化每个.cpp实现文件中的静态变量。 所以在Shape.cpp中:
string Shape::name = "Shape";
在Rectangle.cpp中:
string Shape::name = "Rectangle";
链接器不喜欢这样,并抱怨存在重复的符号。那我怎么能实现呢?
注意:我想坚持使用初始化列表的构造函数(在.cpp中没有实现)
答案 0 :(得分:6)
你要做的事永远不会奏效。 static
变量只能有一个声明分配值,而不是您尝试过的不同文件中的两个单独声明。您尝试做的有点类似于尝试使用两个不同的函数体来阻止相同的函数头。不起作用,不应该工作,重复符号错误。
要使其工作,您需要在name
类中使用名为Rectangle
的另一个静态变量。派生类name
变量隐藏 name
基类中的Shape
变量。
然后你只需使用:
string Rectangle::name="Rectangle"
如果不相信,试试这个
#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;
}
答案 1 :(得分:4)
您可以尝试创建一个返回名称的虚函数。那可能更清洁。我也相信,如果你把这个名字设为私人,你也可以。