我正在尝试学习单例模式,但我面临着设计困境。
一个工作的单例看起来像下面这样: 注意 static myClass * mc;公开,就像 public static myClass * getInstance
1) 工作代码
#include "iostream"
using namespace std;
class myClass {
private:
myClass() {
}
void operator = (const myClass &);
myClass (const myClass & );
public:
static myClass * mc;
static myClass * getInstance () {
cout << "\n getInstance callsed \n";
if (mc == NULL) {
mc = new myClass();
}
return mc;
}
void print() {
cout <<"\n call to print donem \n";
}
};
myClass * myClass::mc =NULL;
int main() {
myClass * mc = myClass::getInstance ();
mc->print();
return 0;
}
2) NOT_WORKING_CODE
不工作的实例会导致编译器错误。请注意,我试图将 static myClass * mc;
设为私有(private)
#include "iostream"
using namespace std;
class myClass {
private:
static myClass * mc;
myClass() {
}
void operator = (const myClass &);
myClass (const myClass & );
public:
static myClass * getInstance () {
cout << "\n getInstance callsed \n";
if (mc == NULL) {
mc = new myClass();
}
return mc;
}
void print() {
cout <<"\n call to print donem \n";
}
};
int main() {
myClass * mc = myClass::getInstance ();
mc->print();
return 0;
}
输出:
在函数 main' 中:
对
myClass::mc' 的 undefined reference
对 `myClass::mc' 的 undefined reference
问题:
1) 为什么我会收到上述 NOT_WORKING_CODE 的错误
2) 我认为使用 public myClass::mc 是违反设计规则的,因为我们应该只将接口(interface)设置为 public 。我面临的问题是上面工作代码 1) 的用户可能会直接访问 myClass::mc 来调用一些函数,如 print myClass::mc->print();没有首先调用实例..
即当我在上面的 1) 中更改以下内容时
int main() {
myClass::mc->print();
myClass * mc = myClass::getInstance ();
mc->print();
return 0;
}
我被它打印出来吓坏了
call to print donem
getInstance callsed
call to print donem
即,我能够在没有有效实例的情况下调用,因为该实例是在 getInstance
中创建的。这意味着如果 print 正在访问一些指针等,我很可能会遇到一些异常。
因此这表明 1) 存在设计缺陷。如何纠正同样的问题......
最佳答案
//myClass * myClass::mc =NULL;
出现错误是因为您注释掉了该行,而不是因为您将变量设为私有(private)。因此,要使代码使用私有(private)变量,只需不要注释该行即可编译。
参见此处:What is an undefined reference/unresolved external symbol error and how do I fix it?
但是你永远不应该以这种方式使用单例模式。事实上,尽量避免使用单例,如果你真的必须使用它们,请使用 Meyers Singleton(谷歌搜索!)
关于c++ - 带指针的单例要求我将实例声明为 public static,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767613/