C++ C++;静态特性
我在访问类中的静态属性时遇到问题。我得到以下错误:C++ C++;静态特性,c++,static,properties,C++,Static,Properties,我在访问类中的静态属性时遇到问题。我得到以下错误: shape.obj:错误LNK2001:未解析的外部符号“public:static class TCollection shape::shapes” 该类的定义为: class Shape { public: static Collection<Shape*> shapes; static void get_all_instances(Collection<Shape*> &list); }
shape.obj:错误LNK2001:未解析的外部符号“public:static class TCollection shape::shapes”
该类的定义为:
class Shape {
public:
static Collection<Shape*> shapes;
static void get_all_instances(Collection<Shape*> &list);
};
类形状{
公众:
静态集合形状;
静态void获取所有实例(集合和列表);
};
静态方法的实现是:
void Shape::get_all_instances(Collection<Shape*> &list) {
list = Shape::shapes;
}
void Shape::获取所有实例(集合和列表){
列表=形状::形状;
}
似乎未初始化shapes
属性。是。您需要添加
Collection<Shape*> Shape::shapes;
集合形状::形状;
在一个.cpp文件中定义静态成员。声明位于类中 定义必须放在一个cpp文件中:
Collection<Shape*> Shape::shapes;
集合形状::形状;
您已经声明了形状
,但尚未定义它
将定义添加到实现文件中
Collection<Shape*> Shape::shapes; //definition
Collection<Shape*> Shape::shapes( whatever constructor args );
集合形状::形状//定义
您是对的,因为静态变量只在类中声明,而没有定义
您也必须定义它们,只需将下面的行添加到您的实现所在的文件中
Collection<Shape*> Shape::shapes;
集合形状::形状;
它应该可以做到这一点。对于代码原样,您需要提供
形状的定义,如(在实现文件中)
集合形状::形状(无论构造函数参数是什么);
但您可能需要考虑一个成员函数,该函数返回对本地静态<代码>集合< /代码>的引用。
干杯&hth.哇,感谢您的快速反馈。花了几个小时研究StackOverflow,花了大约1分钟。我想你会非常后悔既有一个静态变量又有一个公共变量。你真的需要吗?为什么不在需要所有形状列表的地方传递一个const集合&对象呢?这将鼓励其他开发人员在需要列表时调用Shape::get_all_instances(),而不是显式地传递它。这将导致各种各样的问题,当你想要测试或者想要操作形状的子列表时。是的,现在它是公开的,因为狂热的调试。那个狂热的调试人很少是一个好的设计顾问<代码>:)
幸好这是作业:)