【发布时间】:2015-11-03 18:42:26
【问题描述】:
我有以下设置:
foo.h:
class A {
friend class B;
private:
A() {}
};
class B {
public:
void addObject(Object &o); // adds to myMember; A is not exposed!
void computeResult(Result &r); // uses myMember to compute result
private:
vector<A> myMember;
};
A 的对象永远不会暴露给包括foo.h 在内的任何程序。带有A 的向量仅用于帮助B 发挥其计算适配器的作用。通过将A 的构造函数设为私有,我想我可以避免其他编译单元使用它,而且它似乎可以工作。但是问题出在
foo.cpp
void B::computeResult(Result &r) {
MyCustomStorage<A> storage;
A *a = storage.allocate(); // error: "A::A() is private"
}
MyCustomStorage 的一部分看起来像这样:
template <typename T>
class MyCustomStorage {
T *allocate() {
...
T *ptr = new T[count]; // error: "A::A() is private"
...
}
};
但我认为既然allocate() 是从成员函数调用的,这不会发生!我该如何解决这个问题?
让A 成为MyCustomStorage 的朋友似乎非常意大利面。将A 设为B 的私有嵌套类会使foo.cpp 中的各种帮助类失败,因为“A 是私有的”。
那么解决这个问题的最干净的方法是什么?
解决方案
我最终选择了@potatoswatter 的第二个解决方案,并进行了以下适当的更改:
foo.h
class B {
public:
void addObject(Object &o); // adds to myMember; A is not exposed!
void computeResult(Result &r); // uses myMember to compute result
private:
class A {
private:
A() {}
};
class Helper; // forward declared!
vector<A> myMember;
};
foo.cpp
class B::Helper {
int help(A& a) { return 42; } // no problem! Helper is a member of B
}
void B::computeResult(Result &r) {
MyCustomStorage<A> storage;
A *a = storage.allocate(); // no problem! A is a member of B
Helper h;
h.help(*a); // no problem!
}
【问题讨论】:
-
让
B成为A的朋友似乎很好。
标签: c++ private encapsulation access-protection