gpt4 book ai didi

c++ - 带指针的单例要求我将实例声明为 public static

转载 作者:行者123 更新时间:2023-11-30 02:54:53 27 4
gpt4 key购买 nike

我正在尝试学习单例模式,但我面临着设计困境。

一个工作的单例看起来像下面这样:注意 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com