模板类的向量?

Posted

技术标签:

【中文标题】模板类的向量?【英文标题】:Vector of templated class? 【发布时间】:2013-05-30 18:49:53 【问题描述】:

我的一小部分代码有问题,我正在尝试使用模板和模板类的向量 一个朋友帮我写了下面的代码,让它进入编译状态,但我仍然不能很好地使用派生类,所以我完全迷路了,我无法克服这个小错误,我真的可以使用你的帮助

   #include <iostream>
   #include <vector>

   class data_base
   
   public:
         data_base( std::string &_id );

         std::string id;
   ;

   template <typename T>
   class data : public data_base
   
   public:
         data<T>( T &_data, std::string &_id );

         T *data;
   ;

   data_base::data_base( std::string &_id )
   
         id = _id;
   

   template <typename T>
   data<T>::data( T &_data, std::string &_id )
   
        data =& _data;
        id = _id;
   


   int main()
   
       std::vector< data_base*> stuff;

       return 0;
  

如何使用数据类并将其放入填充向量中,然后再访问它? 哦,如果有人知道关于使用基类/派生类的好教程,我真的可以使用它 提前致谢

【问题讨论】:

data_base 似乎没什么用,因为它没有虚函数。您是否尝试重新实现boost::any 我正在使用此代码的一部分,在我的序列化代码中的旧版本中,我最近决定将其更改为与模板兼容,但我无法让它工作。有没有办法完全忽略基类/派生类并以任何可能的方式跳到一个模板化的类向量? 【参考方案1】:

如何使用数据类并将其放入填充向量中,然后再访问它?

其实很简单。让我们完成一些步骤。

要创建模板化数据类的单个实例,请使用尖括号中的类型声明它:

data<int> MyDataObject(0, "zero");

您可能会看到与stuff 声明的相似之处:std::vector&lt; data_base*&gt; stuff;,因为vector 也是一个模板类。

如您所知,要声明类型向量,请将类型放在向量的尖括号内。所以,现在试试这个,你知道如何使用特定的数据类型声明你的类的一个版本:

std::vector<data<int>> MyVector;

你明白其中的逻辑吗?

但是,有一个问题:这不会在大多数 C++ 编译器上编译,但这并不是因为您犯了一个逻辑错误。这是因为末尾的 &gt;&gt; 未被识别为类型声明的一部分 - 它被视为其他内容(>> 有另一种含义。我相信这种情况下的这个问题已在最新的 C++ 规范中得到修复。)修复这个,强制编译器通过添加空格来正确解析它:

std::vector<data<int> > MyVector;

对于解析源代码的编译器来说,空格通常无关紧要,但在这里却很重要。

现在你有了一个使用整数的数据类的向量。

要了解如何使用向量,我推荐this page as a good reference。但快速概述是您使用push_back() 将项目附加到向量,并且可以使用数组索引,即[],通过索引访问特定元素,从第一个元素开始,从0开始,并使用@ 987654331@知道它包含多少元素:

data<int> MyDataObject(0, "zero");
MyVector.push_back(MyDataObject);

data<int> Test = MyVector[0]; // Gets the first item - since only one was added, it should equal MyDataObject.

请注意MyDataObjectMyVector 都分配在堆栈上,因此当它们超出范围时它们将被销毁(每个声明的方法或块 - 块是... 部分 - 结束.) 您还可以在堆上分配,并将指向您的基础对象的指针存储在向量中。如果您想知道如何做到这一点,请发表评论 - 我可以扩展答案。

哦,如果有人知道关于使用基类/派生类的好教程,我真的可以使用它

每个问题只问一个问题。这有助于保持网站井井有条。此外,与您的第一个问题不同,我认为这是您可以轻松研究的问题。但如果您遇到问题,请随时在此处提出其他问题。

但是这里有一个明显的错误。你的数据代码(你的派生类)有这个构造函数:

template <typename T>
   data<T>::data( T &_data, std::string &_id )
   
        data =& _data;
        id = _id;
   

看到它初始化了属于data_base类的成员变量id。

你应该做的是从你的子构造函数调用祖先构造函数,因为它应该已经完成​​了初始化id成员的工作。像这样:

template <typename T>
data<T>::data( T &_data, std::string &_id ) :
     data_base(id) // call parent constructor

     data =& _data;

构造函数中 : 之后的项目是“初始化列表”。事实上,你可以把所有东西都放在那里:

template <typename T>
data<T>::data( T &_data, std::string &_id ) :
     data_base(id), // call parent constructor
     data(_data)
 

顺便说一下,试着改变你命名事物的方式。 data 这里既是你的类的名字,也是一个成员变量的名字。这很令人困惑。有许多不同的常用命名方法可以使内容更清晰,但我个人更喜欢在成员变量前加上 m_(m 代表成员。)这将导致:

template <typename T>
data<T>::data(T &data, std::string &id) :
     data_base(id), // call parent constructor
     m_data(data)
 

并更改声明以匹配(并以类似方式更改基类。)尝试命名事物,以便您至少可以区分类型、局部变量和成员变量。

【讨论】:

以上是关于模板类的向量?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 使用友好类的类型作为模板参数声明 stl 向量

C++:实现向量和矩阵类的最佳结构

C++ 一个包含多种类型模板类的 std::vector

访问模板类对象向量中的对象

在C++的模板类中创建向量

存储 std::shared_ptr<Foo> 的向量,其中 Foo 是模板类