【发布时间】:2020-02-11 15:48:39
【问题描述】:
我已经使用 C++ 抽象类定义了一个接口。我想为我的项目的不同变体多次实例化它(变体可以是硬件变体或操作系统变体)。我的目标是为每个变体创建共享库,并为给定项目使用正确的库,而无需重新编译任何东西。
我为了检索给定变体所需的实例,我正在使用公共函数。在每个变体的 cpp 文件中,我定义了一个函数来返回该变体的实例。在主代码中,我正在对此函数进行外部声明。我打算使用返回的对象调用接口的方法。
// Interface.hpp
class Interface {
public:
virtual void routine() = 0;
};
// variantA.cpp
class variantA : public Interface {
public:
void routine() {
printf( "We are in variantA\n" );
}
} variant;
Interface& getVariant() {
return variant;
}
// variantB.cpp
class variantB : public Interface {
public:
void routine() {
printf( "We are in variantB\n" );
}
} variant;
Interface& getVariant() {
return variant;
}
// main.cpp
#include "Interface.hpp"
extern Interface& getVariant();
int main() {
Interface& interface = getVariant();
interface.routine();
}
// build.sh
g++ -c -fPIC -O0 variantA.cpp
g++ -c -fPIC -O0 variantB.cpp
g++ variantA.o -shared -o libvariantA.so
g++ variantB.o -shared -o libvariantB.so
ln -s libvariantA.so libvariant.so
g++ -L. -lvariant main.cpp -o main
主要问题:我的方法在理论上是否正确?这样做是个好主意吗?或者,这种方法有什么明显的缺陷吗?如果是这样,谁能给我推荐一个更好的方法?
第二个问题:我可能通过一些试验自己弄清楚。但我仍然发布此内容,因为这可能会使该方法无法使用。问题是编译错误:
In function `main':
main.cpp:(.text+0x9): undefined reference to `getVariant()'
collect2: error: ld returned 1 exit status
【问题讨论】:
-
extern Interface& getVariant();应该放在标题中。 -
如果变体代表不同的硬件,我会选择链接时多态性。您的构建系统在哪里选择应该选择哪个实现。
-
感谢@Jarod42,这解决了我的编译问题