使用静态成员函数访问静态数据成员
Using Static Member Function to Access Static Data Member
我正在尝试使用静态成员函数访问静态数据成员,以便我可以调用此函数并检索数据成员。目标是增加/减少此静态数据成员,以计算程序中存在多少对象。
作业逐字记录:
应提供一个名为 getNumObjects 的静态成员函数,该函数不带任何参数,并返回一个 int,指示当前存在的 Complex 类型的对象数。
到目前为止我的代码:
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;
}
测试复杂.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 << "successfuln";
我不明白为什么编译器一直给我这个错误:
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(( 被声明为一个类,那么为什么它说函数的作用域不正确呢?
我不明白为什么编译器一直给我这个错误:
因为您在成员函数定义中重复了static
。该函数已声明为 static
;C++语法要求您省略 cpp 文件中的static
:
int Complex::counter = 0;
// Get number of objects existing in the current program
int& Complex::getNumObjects(){
return counter;
}
注意:返回int&
可能不是一个好主意,因为调用者可以在您不知情的情况下修改counter
:
Complex::getNumObjects() = -123; // <<== returning reference makes this legal
这是非常糟糕的,因为它完全破坏了封装。从本质上讲,您的counter
最终会像公共成员变量一样公开。
您应该更改函数以返回int
:
int Complex::getNumObjects(){
return counter;
}
static
关键字应仅在class
声明中使用。方法实现应省略static
声明:
int& Complex::getNumObjects(){
return counter;
}
奇怪的是,您已经对静态成员变量遵循了此规则;-(
您绝对必须跟踪析构函数和构造函数中的对象。此外,您确实希望计数器为atomic
,以便在多个线程上运行时不会发生争用条件。
struct Complex
{
Complex()
{ ++counter; }
Complex(Complex const&other)
: _real(other._real), _imag(other._imag)
{ ++counter; }
Complex(double r, double i=0)
: _real(r), _imag(i)
{ ++counter; }
// and so on for all other constructors
Complex&operator=(Complex const&) = default;
Complex&operator=(double x)
{
_real = x;
_imag = 0;
return *this;
}
~Complex() { --counter; }
static int getNumObjects() { return counter; }
private:
double _real,_imag;
static std::atomic<int> counter;
};
实际上并不需要移动构造函数(因为堆上没有数据由Complex
管理(。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员