我有多个类需要共享另一个类的单个实例。在公开场合,应该不知道这个类是否存在。做以下事情是否合适? (按书面测试)
#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
编写的头文件没有相应的源文件,那么这是定义其静态成员的最佳位置吗?有一个包括警卫。
还有其他方法可以解决这个问题吗?据我所知(不是很远)我只能用友谊来解决它,我很担心。
答案 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;
...
}