编程语言
首页 > 编程语言> > 是否可以创建将标准(继承)类包装到应用程序中的C宏?

是否可以创建将标准(继承)类包装到应用程序中的C宏?

作者:互联网

因此,我们有简单的接口基类:

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";
  }
};

如果我们要创建一个库-共享或静态的,就可以从它继承而来,但是当我们要创建一个应用程序时,我们必须创建一个主函数并可能添加一些包含.我想创建一些宏,以允许我在不将类编译到共享库的情况下创建这样的主要宏.

我希望它看起来像

// 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

然后,这些宏将获取类名并创建一个主类,该主类将创建并调用我们的类,就好像它在调用常规animall类一样,或者只是为“ animal.hpp”和“ 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();
}

用法:假设我们有一个基于服务的类,并且创建了新服务.我们的主服务器应用程序支持扩展,因此可以将新服务连接到它,将其编译到共享库中.但是,如果我们想将我们的服务变成一个独立的服务器呢?而不是我们需要这样的宏来用main封装它,并可能添加或删除一些#include.

我的意思是做到这一点,以便从我的特殊接口继承的任何类都可以在不进行任何代码更改的情况下,编译到共享库中或完全实现.

解决方法:

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(相当于您的编译器)进行编译,或者使用main附带的名为“ config.h”的文件进行编辑,而无需编辑任何其他代码即可进行编辑.

然后,您可以根据自己的喜好定义动物类别.如果要定义这样的类:

#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,class,macros,cross-platform,shared-libraries
来源: https://codeday.me/bug/20191011/1891414.html