所以我们有简单的接口(interface)基类:
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_;
};
我们希望 ti 从它继承一个像这样的类:
#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,它将创建和调用我们的类,就好像它正在调用一般的 animal 类,或者只是为 "animal.hpp"
和 添加 include “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
。
我的意思是让任何继承 self 的特殊接口(interface)的类都可以编译成共享库或可执行文件,而无需任何代码更改。
最佳答案
int main()
{
int default_age = 4;
SERVICECLASS *an_animal = new SERVICECLASS(default_age);
std::cout << "anmal "<< an_animal->get_name << " created. Its age is " << an_animal->get_age << std::endl;
std::cin.get();
}
然后用(你的编译器的等效项)-DSERVICECLASS=puma
编译,或者有一个名为“config.h”的文件,它包含在 main
中,并且您可以编辑而无需编辑任何其他代码。
然后您可以随心所欲地定义您的动物类别。如果你想这样定义类:
#define STRINGIZE_(ARG) #ARG
#define EXPAND_AND_STRINGIZE(ARG) STRINGIZE(ARG)
class SERVICECLASS: public animal {
public:
SERVICECLASS(int age) : animal(age) {}
virtual std::string get_name() {
return EXPAND_AND_STRINGIZE(SERVICECLASS);
}
};
那么你可以。但是你的类肯定不仅仅是硬编码一个字符串,所以我希望不同的动物需要单独的定义,即使它们有一定数量的共同点。
关于c++ - 是否可以创建这样的 C++ 宏来将您的标准(继承的)类包装到应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981860/