c++ - 是否可以创建这样的 C++ 宏来将您的标准(继承的)类包装到应用程序中?

标签 c++ class macros cross-platform shared-libraries

所以我们有简单的接口(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/

相关文章:

c++ - 通过 C++ 中的指针在对象之间共享数据

c++ - 有没有办法在 Dyalog APL 中⎕NA 导入一个 dll 导出的 C++ 类?

c++ - 创建自己的vector Class,错误很多

c++ - 如何查看扫描仪支持的图像格式?

c++ - 为什么首选 uint32_t 而不是 uint_fast32_t?

java - 原始类和原始数据类型有什么区别?

macros - DrRacket 中的宏步进器

c - 什么时候使用 include 守卫?

c - 多次使用同一源文件时使用 gdb 设置断点

c++ - Lua 5.1 中缺少 luaL_len