1

我有内部对象,客户端代码不应该使用它:

class InternalA {};
class InternalB {};

我有公共接口对象A,B,C。在内部,我需要从A构造objetcs 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

};

你怎么看这个黑客?

4

1 回答 1

0

我认为仅使用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;
}

但是在你使用builder的地方(在其他cpp文件中),你不需要定义A和B,只需要声明builder:

class InternalA;
class C;
InternalA* buildInternalA(const C* c);
于 2012-06-26T09:34:59.250 回答