类c ++中的共享变量

时间:2012-11-08 22:51:10

标签: c++ inheritance static-members

我有多个类需要共享另一个类的单个实例。在公开场合,应该不知道这个类是否存在。做以下事情是否合适? (按书面测试)

#include <iostream>

class hideme
{
    private:
        int a;

    public:
        void set(int b) { a = b; }
        void add(int b) { a += b; }
        int get() { return a; }

        hideme() : a(0) { }
};


class HiddenWrapper
{
    protected:
        static hideme A;

};

hideme HiddenWrapper::A;

class addOne : public HiddenWrapper
{
    public:
        void add() { A.add(1); }
        int get() { return A.get(); }
};

class addTwo : public HiddenWrapper
{
    public:
        void add() { A.add(2); }
        int get() { return A.get(); }
};


int main()
{
    addOne a;
    addTwo b;

    std::cout << "Initialized: " << a.get() << std::endl;

    a.add();
    std::cout << "Added one: " << a.get() << std::endl;

    b.add();
    std::cout << "Added two: " << b.get() << std::endl;

    return 0;
}

对于它的价值,hideme是我试图设计一个外观的库的一部分,而其他类的成员来自库,与静态hideme交互。

此外,如果为HiddenWrapper编写的头文件没有相应的源文件,那么这是定义其静态成员的最佳位置吗?有一个包括警卫。

还有其他方法可以解决这个问题吗?据我所知(不是很远)我只能用友谊来解决它,我很担心。

4 个答案:

答案 0 :(得分:0)

有时,通过构造函数(也称为组合而不是继承)注入共享资源(通过引用或指针)是一个更好的主意。这种方式使您能够共享或不共享(例如,具有代码的线程安全变体而不是)。有关详细信息,请参阅http://de.wikipedia.org/wiki/Inversion_of_Control原则。

答案 1 :(得分:0)

这实现了围绕其他类的单例并隐藏它 用户:

class hideme {};

// fwd declarations
class x;

// library internal
class S
{
  S() = delete;
  S(S const&) = delete;
  void operator=(S const&) = delete;
private:
  static hideme& getInstance()
  {
    static hideme instance;
    return instance;
  }

  friend x;
};

// library classes
class x {
  hideme& s;
public:
  x() : s(S::getInstance()) {}
};

int main()
{
  x x;
  return 0;
}

这不会处理您实际需要hideme的情况 当没有其他对象再次使用它时要被销毁的实例。对于 您需要通过参考获得更多创造性 计数。

我也应该说我认为这是一个坏主意。单身几乎 永远都是。

答案 2 :(得分:0)

您可以通过不在使用它的翻译单元之外访问类来阻止对类的访问。

// public_header.h

class A {
    void bar();
};
class B {
    void foo();
}

// private_implementation.cpp
#include "public_header.h"

namespace {
  class hidden { void baz() {} };

  hidden h;
}

void A::bar() {
    h.baz();
}
void B::foo() {
    h.baz();
}

此类仅可由A :: bar和B :: foo使用。类型hidden和变量h在技术上仍然具有外部链接,但没有其他翻译单位可以说出其名称。

答案 3 :(得分:0)

通常,最好的方法是,如果您的主要部分有一个变量,并且希望与所有类共享它。
例如,如果类X对此变量进行了更改,则更改也发生在主变量中:您可以使用 EXTEND
************************主要**********************

#include <iostream>
using namespace std;

#include "Game.hpp"
//0: not specified yet; 1:singlemode; 2:multiplayerMode
int playingMode = 0;

int main()
{
    Game game;
    game.Run();
    std::cout<< playingMode << std::endl; 
    return 0;
}  

************************ X类******************

#include <iostream>
using namespace std;

extern int playingMode;

....
....

if(m_isSinglePressed)
    {
        playingMode = 1;
        ...

    }
    else if(m_isMultiPressed)
    {
        playingMode = 2;
        ...
    }