我实现了一个线程安全的单例。但是这方面(单身和线程安全)不是我的问题的一部分。
比较两个代码。代码1:
#include <iostream>
using namespace std;
class DataLocation {
private:
DataLocation(std::string) {
}
public:
DataLocation& getInstance() {
std::string s = " ";
static DataLocation instance(s);
return instance;
}
};
int main() {
}
和代码2:
#include <iostream>
using namespace std;
class DataLocation {
private:
DataLocation() {
}
public:
DataLocation& getInstance() {
static DataLocation instance();
return instance;
}
};
int main() {
}
代码1编译好。代码2给出以下错误:
15_singleton.cpp: In member function ‘DataLocation& DataLocation::getInstance()’:
15_singleton.cpp:15:34: error: cannot declare static function inside another function
static DataLocation instance();
^
15_singleton.cpp:16:12: error: invalid initialization of non-const reference of type ‘DataLocation&’ from an rvalue of type ‘DataLocation (*)()’
return instance;
^
从我的观点来看,唯一的区别是私有构造函数有一个零参数。
我如何帮助编译器理解我没有定义任何新内容,但我只是调用构造函数?当有一个参数时,编译器能够理解它。
答案 0 :(得分:5)
删除括号
static DataLocation instance;
使用默认构造函数创建实例。
或者,使用支撑形式的初始化。
static DataLocation instance {};
答案 1 :(得分:2)
static DataLocation instance = DataLocation();
或
static DataLocation instance;
您可能希望将DataLocation& getInstance();
声明为static
方法。
答案 2 :(得分:2)
在声明
时使用括号()
static DataLocation instance();
您打算将其创建为对象。但是,只是一个函数声明。并且您无法在其他非static
函数中创建static
函数。这就是你的错误所指的。
答案 3 :(得分:1)
方法getInstance()
应声明为静态。