0

我有一个 C++ 程序 A.cpp,我包括两个头文件 Xh 和 Yh 这个程序(A.cpp)有一个类 'foo' 和该类所有成员的原型。这个类的实现是在 Xh 和 Yh 中完成的,它们都包含不同的成员函数定义。但是在程序中使用#ifdef 有条件地包含这些文件之一。因此,如果满足某个条件,则 Xh 是#include-ed,否则 Yh 是 #include-ed。他们两个永远不会被包含在一起。这是问题所在:我需要将此编译时切换更改为运行时切换。我知道在运行时不能包含头文件,那么有什么方法可以在不使用命名空间的情况下“选择”我想要的实现?排除了重载,因为函数的原型是相同的。

非常感谢。(对不起,如果这很愚蠢。我是 C++ 的新手)

4

2 回答 2

3

如果您在运行时想要两种不同的行为,那么听起来您正在描述polymorphism。考虑编写两个不同的类,它们继承自具有虚函数的公共基类。然后在运行时你可以做这样的事情:

Animal &a = (x == 3) ? Dog() : Cat();

a.talk();
于 2013-01-14T01:46:44.223 回答
0

也许您想考虑静态工厂方法模式?您可以有一个方法将您选择的实例返回给调用者。您需要按照 OliCharlesworth 的建议进行子类化,然后这将使其对调用代码透明。

在伪代码中。

class baseclass{
...
static baseclass *GimmeImpl(){
    if(aImpl){
       return A();
    }else{
       return B();
    }

}

};

class A:public baseclass {...};
class B:public baseclass {...};
于 2013-01-14T01:47:42.210 回答