有一个C++变量可以是ClassFoo或ClassBar

我有兴趣编写一个打印机来输出两种不同的格式。我们称它们为 txt 和 csv。

可以在 C++ 中实现类似下面的内容吗?

class Printer {
public:
  virtual void header() = 0;
};

class CSV : Printer {
public:
 void header() { printf("csvn"); }
};

class TXT : Printer {
public:
 void header() { printf("txtn"); }
};

int decider(int type) {
  auto prt;
  if (type == 1) {
     prt = new CSV;
  } else {
     prt = new TXT;
  }
  prt.header();
}

如果没有,有什么替代方法可以做类似的事情?

回答

而不是auto你想要一个指向基类的指针

int decider(int type) {
  Printer* prt;
  if (type == 1) {
     prt = new CSV;
  } else {
     prt = new TXT;
  }
  prt->header();
}

但是,而不是原始指针和new(因为您正在从丢失的内存中泄漏delete)我会在这里使用智能指针

#include <memory>

int decider(int type) {
  std::unique_ptr<Printer> prt;
  if (type == 1) {
     prt = std::make_unique<CSV>();
  } else {
     prt = std::make_unique<TXT>();
  }
  prt->header();
}

正如@FredLarson 所指出的,您的基类中还需要一个虚拟析构函数

class Printer {
public:
  virtual ~Printer() = default;
  virtual void header() = 0;
};

您还应该从基类公开继承

class CSV : public Printer { 
  ...
};

class TXT : public Printer {
  ...
};

  • I believe `Printer` will need a virtual destructor to avoid UB here.
  • You can't say `prt.header` in this code. Either change `prt` to `prt_p` and after the if statement make a `Printer& prt`, or change the last line to `prt->header`.

以上是有一个C++变量可以是ClassFoo或ClassBar的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>