【发布时间】:2017-05-26 09:45:28
【问题描述】:
我正在尝试使用静态成员函数访问静态数据成员,以便我可以调用此函数并检索数据成员。目标是增加/减少这个静态数据成员来计算程序中存在多少对象。
作业逐字逐句:
应该提供一个名为 getNumObjects 的静态成员函数,它不接受参数并返回一个 int 值,指示当前存在的 Complex 类型的对象的数量。
到目前为止我的代码:
复杂的.hpp
class Complex{
public:
...
// Get the number of complex objects in the current program
static int& getNumObjects();
...
private:
...
static int counter; // static counter
...
}
复杂的.cpp
// Initialize object counter for getNumObjects()
int Complex::counter = 0;
// Get number of objects existing in the current program
static int& Complex::getNumObjects(){
return counter;
}
testComplex.cpp
// checks to see how many complex objects are open currently
std::cout << "How many complex objecst are in existence? ";
int num = Complex::getNumObjects();
std::cout << num << '\n';
std::cout << "successful\n";
我不明白为什么编译器总是向我抛出这个错误:
error: cannot declare member function ‘static int& Complex::getNumObjects()’ to have static linkage [-fpermissive]
static int& Complex::getNumObjects(){
或者这个错误:
In function ‘int getNumObjects()’:
/../../../ error: ‘counter’ was not declared in this scope
return counter;
^~~~~~~
/../../../ note: suggested alternative: ‘toupper’
return counter;
^~~~~~~
toupper
我进行了广泛的搜索,我似乎已经初始化了我的私有数据成员以及函数。 getNumObjects() 被声明为一个类,为什么说函数的作用域不对呢?
【问题讨论】:
-
您究竟为什么要返回对
int的引用? -
@KinanAlSarmini 以类似的方式,我还有其他函数可以检索其他私有数据成员,这就是为什么我认为我应该只使用引用来尝试访问计数器
-
更好的办法是在构造函数/析构函数内部增加/减少计数器,而不是返回引用并在外部更新。
-
@KinanAlSarmini 我的构造函数和解构函数有内部计数器,但是出现了第二个问题。移动构造函数和复制构造函数是否意味着创建了一个新对象?
-
任何构造函数调用都意味着创建了一个新对象。移动构造函数并没有真正说明正在构造的对象的生命周期,它更多的是关于构造对象的生命周期。所以我想说你应该在你可能拥有的任何构造函数中增加计数器。
标签: c++ class static static-members private-members