c++ - 类方法与构建器

标签 c++

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

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 不可能解决这个问题。要构建 InternalAInternalB,您需要了解 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/

相关文章:

c++ - 如何从 C++ 设置 ListView 模型?

c++ - 推荐在单行编辑控件中可视化指示无效输入的解决方案

c++ - 在两个不同的类中使用 Boost mutex

c++ - 使用#include 加载 OpenCL 代码

c++ - 返回 null shared_ptr 是否正确?

c++ - 为什么类型知识随着 Boost::MPL 消失了?

c++ - 在C++标准中,它在哪里表示用它代表的源代码替换类别描述的间距协议(protocol)?

c++ - 安装 cocoa pod 后,现有静态库不使用 libssl.a 进行 tls 连接并且访问权限不佳

c++ - WndProc 的类方法

C++ 相同的数组 - 不同的输出