返回一个类的私有静态成员

3
我正在尝试跟随网络上的这个例子,该例子引导我使用以下代码:
EquipmentCollection.h(头文件)
#ifndef EQUIMENTCOLLECTION_H_
#define EQUIMENTCOLLECTION_H_

#include "Equipment.h"
#include <vector>

class EquipmentCollection : public Equipment {
public:
    static void add( Equipment* );
    static vector<Equipment*>& get();
    ~EquipmentCollection();
private:
    static vector<Equipment*>* equipmentList;
};

#endif /* EQUIMENTCOLLECTION_H_ */

EquipmentCollection.cpp(源文件)

#include "EquipmentCollection.h"

void EquipmentCollection::add( Equipment* equipment ) {
    if( equipmentList == NULL ) {
        equipmentList = new vector<Equipment*>();
    }

    equipmentList->push_back( equipment );
}

vector<Equipment*>& EquipmentCollection::get() {
    return *equipmentList;
}

EquipmentCollection::~EquipmentCollection() {
    delete( equipmentList );
}

我的错误在源文件中是 return *equipmentList;,这给了我undefined reference to "EquipmentCollection::equipmentList" 的错误。我不知道为什么会出现这个错误。
1个回答

4

您没有初始化静态成员。您应在CPP文件中添加以下代码:

vector<Equipment*>* EquipmentCollection::equipmentList = nullptr;

此外,您的代码还存在其他问题:
- 您没有创建任何EquipmentCollection实例,因此您的析构函数永远不会被调用,并且设备永远不会被释放。 - 如果在之前没有调用::add,那么EquipmentCollection::get就会产生未定义行为,原因是(8.3.2/4 "References"):

Note: 特别地,null引用在一个明确定义的程序中不存在,因为创建这样的引用的唯一方法是将其绑定到通过解引用空指针获得的“对象”,这会导致未定义行为。


关于其他问题。如果我在main()方法中创建实例,那么这个问题就会得到解决,对吗?至于第二个问题。我正在学习单元测试来避免这种情况。这就是这个例子的目的。我说的对吗? - user2785929
@user2785929:创建一个类的实例,仅使用其静态函数并仅取消初始化静态成员,这听起来有点像反模式。关于单元测试,单元测试可以测试您的代码。它们无法消除语言官方标准中定义的未定义行为。 - Krizz
我明白你的意思。谢谢你的指导。我真的很新手c++。 - user2785929
1
你也可以提到,仅通过值存储向量将消除所有问题。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接