所以我们有简单的接口基类:
class animal {
public:
animal(int age) : age_(age) {
}
virtual ~animal(void) {
}
virtual std::string get_name(void) {
return "A generic animal";
}
int get_age(void) {
return age_;
}
protected:
int age_;
};
我们想用这样的类继承它:
#include "animal.hpp"
#include "some_includes_for_our_shared_libs.hpp"
class puma : public animal {
public:
puma(int age) : animal(age) {}
virtual std::string get_name() {
return "puma";
}
};
如果我们正在创建一个库 - 共享的或静态的ok
对我们来说只是继承它,但是当我们想要创建一个应用程序时,我们必须创建一些主要功能,并且可能添加一些包含内容。我想创建一些宏,允许我创建这样的 main 以防类被编译到共享库中。
我希望它看起来像
// puma.cpp
#include "FILE_WITH_MACROS.hpp"
ANIMAL_MACROS_NAME_HERE class puma : public animal {
public:
puma(int age) : animal(age) {}
virtual std::string get_name() {
return "puma";
}
};
//end of puma.cpp
该宏将获取类名并创建一个 main,该 main 将创建并调用我们的类,就像调用一般的 Animall 类一样,或者只是添加包含"animal.hpp"
and "some_includes_for_our_shared_libs.hpp"
.
因此,如果共享库类将被宏转换为
#include "animal.hpp"
#include "some_includes_for_our_shared_libs.hpp"
class puma : public animal {
public:
puma(int age) : animal(age) {}
virtual std::string get_name() {
return "puma";
}
};
如果应用程序类将由宏变成
#include <iostream>
#include "animal.hpp"
class puma : public animal {
public:
puma(int age) : animal(age) {}
virtual std::string get_name() {
return "puma";
}
};
int main()
{
int default_age = 4;
puma *an_animal = new puma(default_age);
std::cout << "anmal "<< an_animal->get_name << " created. Its age is " << an_animal->get_age << std::endl;
std::cin.get();
}
用法:想象我们有一个service-base
类和我们创建的new-service
。我们的主服务器应用程序支持扩展,因此new-service
可以连接到它,然后它被编译成共享库。但是如果我们想让我们的服务成为一个独立的服务器怎么办?比我们需要这样的宏来包装它main
并可能添加或删除一些#includes
.
我的观点是,这样任何从我的特殊接口继承的类都可以编译到共享库或可执行文件中,而无需更改任何代码。