【发布时间】:2012-11-08 22:51:09
【问题描述】:
我有多个类需要共享另一个类的单个实例。公开地,应该不知道这个类的存在。执行以下操作是否合适? (书面测试)
#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 编写的头文件没有对应的源文件,那是定义其静态成员的最佳位置吗?带有一个包含保护。
还有其他方法可以解决这个问题吗?据我所知(不是很远),我只能通过友谊来解决它,我对此很警惕。
【问题讨论】:
-
当使用它的最后一个对象被销毁时,该单个对象是否应该被销毁?一个有私人成员和朋友的单身人士就够了吗?
-
我的规则始终是公共继承适用于 IS A 关系。当一个类需要成为另一个类的更具体的实例时,您可以使用它。您可以使用私有继承,这样会更好一些。另一种选择是让每个人都持有引用或共享指针。
-
为了避开朋友,我在多个地方阅读过,所以我一直这样做。不过这是一种可能。我现在正在研究组合,看起来它涉及共享引用或指针。谢谢
-
friend关键字不会破坏封装,它可以帮助您改进它。
标签: c++ inheritance static-members