全局共享一个类的一个对象/实例?

时间:2016-03-20 09:49:20

标签: c++

我想全局共享一个类的实例,这样我就可以从我想要的任何源文件中访问该类的成员函数。我对此并不熟悉,所以我想知道最好的方法。对于记录,这是我的程序的一部分,将文本输出到日志窗口,因此输入将来自我的程序中的几乎每个类。这是一些示例代码:

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)。我不想在MyClass someInstance2中创建OtherClass2。如何使用我已创建的someInstance1中的OtherClass1

这是我对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

2 个答案:

答案 0 :(得分:0)

一种选择是让课程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");
}

答案 1 :(得分:-1)

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