【发布时间】:2018-03-09 10:33:41
【问题描述】:
我正在编写需要几种堆栈的代码。比如stack<int>, stack<vector<int>>, stack<map<int, string>>, stack<vector<vector<int>>等。
我有一个基类,它包含一个虚函数 foo(...参数列表...)。这个基类被用作多个派生类的父类,这些派生类的 foo() 适用于不同类型的堆栈。因此,derived1 可能正在使用 stack<int>,而 derived2 可能在各自的 foo() 中使用 stack<vector<vector<int>> 等等。
现在我将所有堆栈传递给所有 foo 函数。因此,每次要实现一个新堆栈时,我的 foo() 定义都必须在基类和所有派生类中再插入一个堆栈类型。
例如,最初我只有一个派生类,我的基类和派生类就像
class Base
{
public:
void foo(stack<int>) = 0;
}
class Derived : public Base
{
public:
void foo(stack<int>)
{
...
...
}
}
现在当一个新的派生类出现时,假设使用stack<vector<int>>。我需要将我的 Base 和所有派生类 foo() 更新为
void foo(stack<int> a, stack<vector<int> b)
{
....
....
}
相反,我现在想要实现的是创建一个包含各种堆栈的StackWrapper 类,并且我可以使用不同的键来寻址不同的堆栈。
有点像
class StackWrapper
{
stack<int> derived1;
stack<vector<int>> derived2;
some-return-type operator[](char ch)
{
switch(ch)
{
case 'a': return derived1;break;
case 'b': return derived2;break;
}
}
}
这样,我只需要在这个 stackwrapper 类中添加一个新的堆栈类型对象,然后在不同的派生类 foo() 中使用 stackWrapperObj['a'] 或 stackWrapperObj['b'] 之类的东西。
有什么方法可以允许这样的类设计。
注意:- 我不希望在 foo() 中进行任何转换,例如返回 void* 然后再转换它,而是我想以某种方式返回一个转换对象,具体取决于我分配给不同堆栈的各种键类型。这样我就可以进行类似
stack<int> a = stackWrapperObject['a'];
stack<vector<int>> b = stackWrapperObject['b'];
【问题讨论】:
-
是否有机会在与堆栈中包含的类型正交的各种堆栈上进行所需的操作,并使用迭代器? IE。泛泛地解决问题而不是面向对象?
-
为什么类派生自一个通用类型?是因为你需要在运行时切换类型,还是因为你希望在编译时做不同的事情时能够重用相同的代码?
-
使用模板类而不是继承。
-
运行时状态不能改变变量的类型。有很多方法可以解决您的问题,但最好的方法将取决于您开始使用此系统的原因。我可以猜出你真正想要什么并解决它,但如果你解释一下你为什么要这样做,它会更容易也更有可能有用。
-
@tilak 仅描述技术细节,而不是您的问题。为什么有一个共同的基类呢?从表面上看,这似乎是个坏主意。可能您有一个理由说明这不是一个坏主意,而这个理由可以告诉我们如何解决您的问题。或者也许你认为你有这个理由,但你错了。
标签: c++ templates inheritance stl virtual-functions