C++ 类方法与生成器

C++ 类方法与生成器,c++,C++,我有内部对象,客户端代码不应使用这些对象: class InternalA {}; class InternalB {}; 我有公共接口对象A、B、C。在内部,我需要从A构建ObjeTC InternalA,从B构建InternalB,但A和B只能通过指向基类C的指针访问。我可以使用协变虚方法,但这样做,我的内部变得公共,而InternalA和InternalB实际上不是同一基类的两个子字节。 或者我可以这样做: class C { // some data public: C

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

class InternalA {};
class InternalB {};
我有公共接口对象A、B、C。在内部,我需要从A构建ObjeTC InternalA,从B构建InternalB,但A和B只能通过指向基类C的指针访问。我可以使用协变虚方法,但这样做,我的内部变得公共,而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); };
};
void somefunction(A *a) {
    InternalA x(<using a->smthg>);
    // do stuffs
};
void somefunction(B *b) {
    InternalB x(using b->smthg>);
   //do stuffs
C类{
//一些数据
公众:
C(){};
//一些纯虚方法和虚方法
虚拟C*getConcrete(void)const=0;
};
B类:C类{
公众:
//方法
虚拟B*getConcrete(void){返回static_cast(this);};
};
A类:C类{
公众:
//方法
虚拟A*getConcrete(void){返回static_cast(this);};
};
然后在A或B参数中使用带有多态方法的内部生成器

编辑: 要构建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); };
};
void somefunction(A *a) {
    InternalA x(<using a->smthg>);
    // do stuffs
};
void somefunction(B *b) {
    InternalB x(using b->smthg>);
   //do stuffs
void somefunction(A*A){
内联x(smthg>);
//做事
};
空函数(B*B){
内部b x(使用b->smthg>);
//做事
})


你觉得这个黑客怎么样?

我认为仅仅使用
C类
是不可能解决这个问题的。要构建
InternalA
InternalB
您需要了解A或B。在构建器定义中,必须定义A或B。因此,我认为您应该使用
动态\u cast
。或者如果禁止使用
dynamic\u 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;
}

在您的示例中,
InternalA
InternalB
在哪里发挥作用?内部构建器可以从指向对象A或B的指针构建它们。但要构建InternalA或InternalB,我需要具体的类A或B,我不能用抽象类C来实现这一点,因为我需要选择是构建InternalA还是InternalB,您对这个构建器函数期望什么样的签名?它将接收什么样的参数来构建
A
B
对象?但我认为,即使最终有点笨重,情况也会很好。