Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;存储模板结构_C++_Class_Templates_Struct_Storage - Fatal编程技术网

C++ C++;存储模板结构

C++ C++;存储模板结构,c++,class,templates,struct,storage,C++,Class,Templates,Struct,Storage,我有一个基本结构FooBase: struct FooBase { }; template <typename typeName> struct Foo : public FooBase { typeName* foo }; 然后我创建了一个模板结构Foo,它是FooBase的子级: struct FooBase { }; template <typename typeName> struct Foo : public FooBase { typeName* foo

我有一个基本结构
FooBase

struct FooBase { };
template <typename typeName> struct Foo : public FooBase { typeName* foo };
然后我创建了一个模板结构
Foo
,它是
FooBase
的子级:

struct FooBase { };
template <typename typeName> struct Foo : public FooBase { typeName* foo };
然后我需要访问存储的数据,但是我得到了一个可预测的明显错误,即
FooBase
中缺少成员
foo

FooVector[0].foo
我不能写这样的东西

Foo <Bar> fooInstance = FooVector[0]
Foo fooInstance=FooVector[0]
因为我不知道模板参数

如何在向量中存储
Foo
的实例,以便以后访问它们请注意,在最后一步——从向量读取数据时——我不知道模板参数。

p.S.不允许推进您正在此处进行切片:

vector <FooBase> FooVector
...    
Foo <Bar> fooInstance;
fooInstance.foo = new Bar();
FooVector.push_back ( fooInstance );
返回对不了解
Foo
FooBase
的引用。您可以直接存储
Foo

vector<Foo<Bar>> FooVector;
vector;
或者存储指向
FooBase
的指针或智能指针,但无论如何,您必须将元素动态转换为
Foo*
,这不是一个很好的解决方案。

您在这里切片:

vector <FooBase> FooVector
...    
Foo <Bar> fooInstance;
fooInstance.foo = new Bar();
FooVector.push_back ( fooInstance );
返回对不了解
Foo
FooBase
的引用。您可以直接存储
Foo

vector<Foo<Bar>> FooVector;
vector;

或者存储指向
FooBase
的指针或智能指针,但无论如何,您必须将元素动态转换为
Foo*
,这不是一个很好的解决方案。

这里发生的是,在您的

FooVector.push_back ( fooInstance );

行,C++默默地调用<代码> FooBase< /C> >的复制构造函数,因为只能在vector中保存该类型的对象。由于

Foo
公开继承自
FooBase
方法
FooBase::FooBase(FooBase const&)
可以使用类型为
Foo
的对象调用

因此,您并不是真正存储
Foo
s,而是实际上存储
FooBase
s。要做您想做的事情,您需要一个
std::vector
std::vector

但是,向量的内容仍然缺少
foo
成员,因为静态类型仍然不是
foo
。要解决这个问题,你有一些选择。您可以将
dynamic\u cast
static\u cast
您的
FooBase*
转换到
Foo*
中,然后访问其
Foo
成员。但这可能会中断,因为
FooBase*
指针实际上可能持有另一种类型,而不是
Foo


为什么不直接用std::vector来代替呢?

这里发生了什么,是在你的

FooVector.push_back ( fooInstance );

行,C++默默地调用<代码> FooBase< /C> >的复制构造函数,因为只能在vector中保存该类型的对象。由于

Foo
公开继承自
FooBase
方法
FooBase::FooBase(FooBase const&)
可以使用类型为
Foo
的对象调用

因此,您并不是真正存储
Foo
s,而是实际上存储
FooBase
s。要做您想做的事情,您需要一个
std::vector
std::vector

但是,向量的内容仍然缺少
foo
成员,因为静态类型仍然不是
foo
。要解决这个问题,你有一些选择。您可以将
dynamic\u cast
static\u cast
您的
FooBase*
转换到
Foo*
中,然后访问其
Foo
成员。但这可能会中断,因为
FooBase*
指针实际上可能持有另一种类型,而不是
Foo


为什么不直接使用std::vector来代替呢?

正如前面的回答中所提到的,您正在将条分割成FooBase对象。向量必须存储对Foo对象的引用,而不是对象本身

实现这一点的最简单方法是使用boost库中的一种smart_ptr类型

#include <boost/shared_ptr.hpp>
#include <vector>
typedef std::vector< boost::shared_ptr<FooBase> > FooVector;
...
FooVector v;
v.push_back( new Bar() );
#包括
#包括
typedef std::vectorFooVector;
...
食物载体v;
v、 向后推(新杆());

如果将指针本身存储到向量中,则内存管理会出现问题,使用boost shared_ptr类型将自动为您处理分配。

如前面的答案所述,您正在将条分割为FooBase对象。向量必须存储对Foo对象的引用,而不是对象本身

实现这一点的最简单方法是使用boost库中的一种smart_ptr类型

#include <boost/shared_ptr.hpp>
#include <vector>
typedef std::vector< boost::shared_ptr<FooBase> > FooVector;
...
FooVector v;
v.push_back( new Bar() );
#包括
#包括
typedef std::vectorFooVector;
...
食物载体v;
v、 向后推(新杆());

如果将指针本身存储到向量中,则内存管理会出现问题,使用boost shared_ptr类型将自动为您处理分配。

是的,我知道。如何存储
Foo
的向量?如果我把指向Foo的指针放在指向FooBase的指针向量中,它会改变什么吗?@Kolyunya:指针向量是避免切片的一种方法。然而,它使向量的复制构造函数和复制赋值做了错误的事情。这是最丑陋的C++问题之一,IMO(其他丑陋的解决方案包括PrtIfVoad,Booo::任何,智能指针的向量)。Kolyunya我给我的答案增加了一些选项。<代码>但是,你无论如何都必须动态地把这些元素转换成Fo*,这不是一个非常好的解决方案。< /代码>我不能抛出,因为我不知道模板参数的值<代码>栏只是一个example@Kolyunya:那么您可以对返回的对象做什么?!如果您不知道它的类型,您怎么知道它支持哪些函数或它有哪些数据成员?听起来你需要把你需要在一个你不知道其完整类型的对象上调用的任何功能推送到基类中。是的,我知道。如何存储
Foo
的向量?如果我把指向Foo的指针放在指向FooBase的指针向量中,它会改变什么吗?@Kolyunya:vector