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

标签 c++ pointers singleton

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

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

相关文章:

c++ - 迭代 std::list 时删除

c - char指针如何成为整个字符串?

c++ - 调用单例库

jakarta-ee - 使用 Java EE BeanManager 作为单例

php - 如何使用 libcurl 从用 C++ 编写的游戏发布到我服务器上的 php 页面更安全?

c++ - 使用 STL vector 作为字节数据的 FIFO 容器

c++ - 通过 MSBuild 构建 Visual Studio 2015 C++ 项目 (v140) 失败 - 找不到 v140

c - 这会释放我所有的**指针内存吗?

c - c 中的指针没有得到正确的输出

c# - 将一个类绑定(bind)到多个接口(interface)作为单例