【问题标题】:Sharing one object/instance of a class globally?全局共享一个类的一个对象/实例?
【发布时间】:2016-03-20 09:49:19
【问题描述】:

我想全局共享一个类的实例,以便我可以从我想要的任何源文件访问该类的成员函数。我对此有点陌生,所以我想知道最好的方法。作为记录,这是我的程序的一部分,它将向日志窗口输出文本,因此输入将来自我程序中的几乎每个类。下面是一些示例代码:

MyClass.h

class MyClass
{

public:
  MyClass();

private:
  int start, end;
  void parse(std::string);
};

MyClass.cpp

#include "myclass.h"    
MyClass::MyClass()
{
}

void MyClass::parse(std::string){
// do some stuff here
}

OtherClass1.h

#include "myclass.h"    
class OtherClass1
{
  public:
    OtherClass1();

  private:
    MyClass someInstance1;
};

OtherClass1.cpp

#include "otherclass1.h"
OtherClass1::OtherClass1()
{
  someInstance1.parse("This is a string.")
}

好的,太好了。但现在我希望能够在另一个类中使用相同的someInstance1 实例(即OtherClass2)。我不想在OtherClass2 中创建MyClass someInstance2。如何使用我已经创建的位于OtherClass1 中的someInstance1

这是我为OtherClass2 提供的信息。我不能使用someInstance1,因为它是私有的。

OtherClass2.h

#include "myclass.h"
#include "otherclass1.h" 
class OtherClass2
{
  public:
    OtherClass2();

  private:
    MyClass someInstance2;
};

OtherClass2.cpp

#include "otherclass2.h"
OtherClass2::OtherClass2()
{
  someInstance2.parse("This is a string.")
}

在整个程序中,我只想要一个 MyClass 实例。有一个更好的方法吗?我总是读到,拥有全局任何东西是不好的做法,但我应该怎么做呢?

编辑:我在这里找到了答案:https://stackoverflow.com/a/2798624/2574608

【问题讨论】:

标签: c++


【解决方案1】:

一种选择是将MyClass 类设为singleton。 Singleton 是创造性的Gang of Four patterns 之一。

这是一个简单的 C++11 实现:

MyClass.h

#include <string>

class MyClass
{
private:
    /* private constructor */
    MyClass();
    int start, end;

public:
    /* static method to get a reference to the MyClass instance */
    static MyClass& getInstance();       
    void parse(const std::string& str);
};

MyClass.cpp

#include "MyClass.h"
#include <iostream>

MyClass::MyClass() {}

MyClass& MyClass::getInstance() {
    static MyClass instance;
    return instance;
}

void MyClass::parse(const std::string& str) {
    // do some stuff here
    std::cout << __func__ << ": " << str << std::endl;
}

现在您可以在整个程序中访问MyClass 实例 使用MyClass::getInstance():

#include "MyClass.h"

int main() {
    MyClass::getInstance().parse("foo");
}

【讨论】:

【解决方案2】:

Singleton 类,但它们就像隐藏的全局变量。我认为您应该将所需的类(例如在构造函数中)传递给所有需要它的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多