我有内部对象,客户端代码不应该使用这些对象:
class InternalA {};
class InternalB {};
我有公共(public)接口(interface)对象 A、B、C。在内部,我需要从 A 构造对象 InternalA,从 B 构造 InternalB,但是 A 和 B 只能通过指向基类 C 的指针访问。我可以使用协变虚拟方法,但这样做,我的 Internals 变得公开,并且 InternalA 和 InternalB 实际上不是同一基类的两个子类。 或者我可以做类似的事情:
class C {
// some data
public:
C() {};
// some pure virtual methods and virtual methods
virtual C *getConcrete(void) const =0;
};
class B : C {
public:
//methods
virtual B *getConcrete(void) { return static_cast<B>(this); };
};
class A : C {
public:
//methods
virtual A *getConcrete(void) { return static_cast<A>(this); };
};
然后在 A 或 B 参数中使用具有多态方法的内部构建器。
编辑: 要构建 InternalA 和 InternalB,我可以使用这样的函数/方法:
void somefunction(A *a) {
InternalA x(<using a->smthg>);
// do stuffs
};
void somefunction(B *b) {
InternalB x(using b->smthg>);
//do stuffs
};
您如何看待这次黑客攻击?
最佳答案
我认为仅使用 class C
不可能解决这个问题。要构建 InternalA
或 InternalB
,您需要了解 A 或 B。在构建器定义中,必须定义 A 或 B。所以我认为你应该使用 dynamic_cast
。或者如果 dynamic_cast
被禁止,则由虚函数实现的某种类型 id。
#include "A.h"
......
InternalA* buildInternalA(const C* c) {
const A* a = dynamic_cast<const A*>(c);
if (a)
return new InternalA(a);
return 0;
}
但是在你使用构建器的地方(在其他cpp文件中),你不需要定义A和B,只需要声明构建器:
class InternalA;
class C;
InternalA* buildInternalA(const C* c);
关于c++ - 类方法与构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204009/