在 class 中使用 "multitype" 成员变量的最佳方式是什么?
What's the best way to have a "multitype" member variable in a class?
我目前正在为我们的代码库中已经定义的 class 添加新功能,并且由于之前没有遇到过这样的问题,我 运行 遇到了问题(我我对 C++/编码还是相当陌生)。下面是 class:
的简化版本
class Foo {
public:
Foo();
~Foo();
Input ReturnInput() { return fizz.GetFizzInput(); }
Output ReturnOutput() { return fizz.GetFizzOutput(); }
private:
Fizz fizz;
};
我正在尝试使成员变量 fizz
可以是不同的类型 Buzz
,并调用仅在中实现的特定方法(即 GetBuzzOutput/Input()
) Buzz
class。 Fizz
和 Buzz
都继承自同一个父 class,但是那个父 class 没有实现这些特定的方法。
以下是我考虑过的一些选项。所有这些都需要向 Foo
的构造函数添加一个参数和一个额外的成员变量来让我们区分我们想要的类型 - Fizz
或 Buzz
.
添加类型为 Buzz
的第二个成员变量,并根据需要使用任一成员变量。这似乎并不理想,因为每次构造 Foo
时,这些成员变量之一将未被使用。
将成员变量改为指向Fizz
和Buzz
基class的指针,并使用dynamic_cast
向下转型到合适的调用特定方法时键入。我也不认为这是个好主意,但我不太清楚为什么 - 这主要只是一种感觉。
将 Foo
拆分为两个 class,FooFizz
和 FooBuzz
(每个 Fizz
或 Buzz
作为成员变量),并根据我们想要的版本实例化适当的版本。这似乎是最好的选择,但也许有一些我不明白的看不见的问题。
有没有更好的方法来解决这个问题?我是否遗漏了一些能让这更容易的东西?不幸的是,我无法在 Fizz
和 Buzz
的父 class 中实现虚拟方法。
非常感谢您的任何建议。
假设给定的 Foo 对象不需要能够在运行时从 holding-a-Fizz 切换到 holding-a-Buzz,C++ 模板将为您提供所需的灵活性,而无需重复编写代码一个 FooFizz 和一个 FooBuzz class:
template <class T> class Foo {
public:
Foo();
~Foo();
Input ReturnInput() { return t.GetInput(); }
Output ReturnOutput() { return t.GetOutput(); }
private:
T t;
};
typedef Foo<Fizz> FooFizz;
typedef Foo<Buzz> FooBuzz;
我目前正在为我们的代码库中已经定义的 class 添加新功能,并且由于之前没有遇到过这样的问题,我 运行 遇到了问题(我我对 C++/编码还是相当陌生)。下面是 class:
的简化版本class Foo {
public:
Foo();
~Foo();
Input ReturnInput() { return fizz.GetFizzInput(); }
Output ReturnOutput() { return fizz.GetFizzOutput(); }
private:
Fizz fizz;
};
我正在尝试使成员变量 fizz
可以是不同的类型 Buzz
,并调用仅在中实现的特定方法(即 GetBuzzOutput/Input()
) Buzz
class。 Fizz
和 Buzz
都继承自同一个父 class,但是那个父 class 没有实现这些特定的方法。
以下是我考虑过的一些选项。所有这些都需要向 Foo
的构造函数添加一个参数和一个额外的成员变量来让我们区分我们想要的类型 - Fizz
或 Buzz
.
添加类型为
Buzz
的第二个成员变量,并根据需要使用任一成员变量。这似乎并不理想,因为每次构造Foo
时,这些成员变量之一将未被使用。将成员变量改为指向
Fizz
和Buzz
基class的指针,并使用dynamic_cast
向下转型到合适的调用特定方法时键入。我也不认为这是个好主意,但我不太清楚为什么 - 这主要只是一种感觉。将
Foo
拆分为两个 class,FooFizz
和FooBuzz
(每个Fizz
或Buzz
作为成员变量),并根据我们想要的版本实例化适当的版本。这似乎是最好的选择,但也许有一些我不明白的看不见的问题。
有没有更好的方法来解决这个问题?我是否遗漏了一些能让这更容易的东西?不幸的是,我无法在 Fizz
和 Buzz
的父 class 中实现虚拟方法。
非常感谢您的任何建议。
假设给定的 Foo 对象不需要能够在运行时从 holding-a-Fizz 切换到 holding-a-Buzz,C++ 模板将为您提供所需的灵活性,而无需重复编写代码一个 FooFizz 和一个 FooBuzz class:
template <class T> class Foo {
public:
Foo();
~Foo();
Input ReturnInput() { return t.GetInput(); }
Output ReturnOutput() { return t.GetOutput(); }
private:
T t;
};
typedef Foo<Fizz> FooFizz;
typedef Foo<Buzz> FooBuzz;