【发布时间】:2021-07-06 12:56:00
【问题描述】:
我目前正在为我们的代码库中已定义的类添加新功能,但由于之前没有遇到过这样的问题,我遇到了问题(我对 C++/编码还是很陌生) .下面是该类的简化版本:
class Foo {
public:
Foo();
~Foo();
Input ReturnInput() { return fizz.GetFizzInput(); }
Output ReturnOutput() { return fizz.GetFizzOutput(); }
private:
Fizz fizz;
};
我正在尝试使成员变量fizz 可以是不同类型的Buzz,并调用仅在Buzz 类中实现的特定方法(即GetBuzzOutput/Input())。 Fizz 和 Buzz 都继承自同一个父类,但该父类没有实现这些特定方法。
以下是我考虑过的一些选项。所有这些都需要向Foo 的构造函数添加一个参数和一个额外的成员变量,以便我们区分我们想要的类型——Fizz 或Buzz。
-
添加
Buzz类型的第二个成员变量,并根据需要使用任一成员变量。这似乎并不理想,因为每次构造Foo时,其中一个成员变量都将未被使用。 -
将成员变量改为指向
Fizz和Buzz基类的指针,调用具体方法时使用dynamic_cast向下转换为合适的类型。我也不认为这是一个好主意,但我不太清楚为什么——这主要是一种感觉。 -
将
Foo拆分为两个类,FooFizz和FooBuzz(每个类都有Fizz或Buzz作为成员变量),并根据我们想要的类型实例化适当的版本。这似乎是最好的选择,但也许有一些我不理解的看不见的问题。
有没有更好的方法来解决这个问题?我是否错过了一些可以让这变得更容易的东西?我无法在Fizz和Buzz的父类中实现虚方法,很遗憾。
非常感谢您的建议。
【问题讨论】:
-
另一种选择:
std::variant<Fizz, Buzz> -
泛型和多态不能解决你的问题吗?
-
听起来你已经有了 Fizz 和 Buzz 的基类,所以只需在 Foo 中添加该基类的指针,然后在创建 Foo 实例时创建适当的实例,例如
std::unique_ptr<MyBase> fizzbuzz;..fizzbuzz = std::make_unique<Buzz>();或fizzbuzz = std::make_unique<Fizz>(); -
谢谢大家的想法。不幸的是,我们锁定了 C++17 之前的 C++ 版本,所以我无法使用
std::variant。我认为我不能使用多态性,因为当我尝试调用特定方法(即GetFizzInput/Output)时,编译器会抱怨该对象没有实现相关的方法。我也许可以dynamic_pointer_cast得到正确的类型。
标签: c++ class inheritance type-conversion