c++;用于生成未知类实例列表的模板 我有一个情况,我试图写一些C++代码来实现,我想我需要使用模板,但我不确定。我认为我对模板理解不够,只是想知道我是否走上了正确的道路。我以前从未实现过需要模板的类
我有一个基类,它需要实例化一个新类,并将其存储在一个列表中以供将来访问。需要实例化的类派生自具有一个虚拟方法的基类。实例化类后,将调用此方法,并将新实例存储在列表中。提供了另一种方法来获取实例化对象 假设虚拟类名为foo:c++;用于生成未知类实例列表的模板 我有一个情况,我试图写一些C++代码来实现,我想我需要使用模板,但我不确定。我认为我对模板理解不够,只是想知道我是否走上了正确的道路。我以前从未实现过需要模板的类,c++,templates,C++,Templates,我有一个基类,它需要实例化一个新类,并将其存储在一个列表中以供将来访问。需要实例化的类派生自具有一个虚拟方法的基类。实例化类后,将调用此方法,并将新实例存储在列表中。提供了另一种方法来获取实例化对象 假设虚拟类名为foo: class foo { public: virtual void process() = 0; } 用户将创建一个类栏: class bar : public foo { public: void process() {}; } 我认为需
class foo
{
public:
virtual void process() = 0;
}
用户将创建一个类栏:
class bar : public foo
{
public:
void process() {};
}
我认为需要作为模板类的类:
class Filter<Foo* T>
{
public:
// use value junk to derive foo
// and put the new instance on a std::list
add(Junk* junk);
T get();
private:
std::list<T> mFooList;
}
void Filter::add(Junk* junk)
{
T* foo = new T();
foo.p(junk);
mFooList.push_back(foo);
}
T* Filter::get()
{
if(!mFoolist.empty())
{
T* res = mFooList.back();
mFooList.pop_back();
return res;
}
return nullptr;
}
类过滤器
{
公众:
//使用价值垃圾来派生foo
//并将新实例放在std::列表中
添加(垃圾*垃圾);
T get();
私人:
std::列表mFooList;
}
空过滤器::添加(垃圾*垃圾)
{
T*foo=新的T();
副食品(垃圾);;
mFooList.push_back(foo);
}
T*Filter::get()
{
如果(!mFoolist.empty())
{
T*res=mFooList.back();
mFooList.pop_back();
返回res;
}
返回空ptr;
}
在这种情况下,您不需要使用模板。在C++中,派生类可以被分配给基类的指针。你可以使用foo指针
class foo
{
public:
virtual void process();
};
class bar1: public foo
{
public:
void process();
};
class bar2 : public foo
{
public:
void process();
};
class filter
{
private:
std::list<foo*> _foos;
public:
foo* get();
void add(foo* f);
};
void filter::add(foo* f)
{
_foos.push_back(f);
}
foo* filter::get()
{
if(!_foos.empty())
{
return _foos.pop_back();
}
return nullptr;
}
你这里有几个问题<代码>类筛选器不是声明模板的方法。并且
void Filter::add(Junk*Junk)
不以任何方式使用Junk
,那么它应该如何影响存储值呢?还有,mFooList.pop_back()
是一个void
函数,因此实际上不返回任何内容。我只是省略了关于如何使用垃圾作为fir滤波器系数的细节。我只是觉得这会给问题增加不必要的复杂性。所以让我更清楚地理解你的语法-你想让T
成为从Foo
派生的类型,作为模板参数传递给Filter
类,还是我过度解释了你的代码?就像我说的,我不知道我理解这一点。用户将定义一个从foo派生的类,将其称为bar并将其告知filter类。然后,当新数据进入时,过滤器将处理传入的数据并创建类栏的实例。用户可以通过get方法获得筛选结果。当用户调用add时,参数是一个不同的类,该类在定义类筛选器时已知。它是输入类。我希望能够允许用户通过指定一个类来更改过滤器的实现,该类将以他们想要的方式处理输入。。注意void
返回类型。注意下划线前缀。
filter fil;
fil.add(new foo());
fill.add(new bar1());
fill.add(new bar2());
foo f = fill.get();
while(f != nullptr)
{
f->process();
delete f;
f = fil.get();
}