如何使用数据类并将其放入填充向量中,然后再访问它?
其实很简单。让我们完成一些步骤。
要创建模板化数据类的单个实例,请使用您希望它在尖括号中使用的类型声明它:
data<int> MyDataObject(0, "zero");
您可能会看到与stuff
:声明的相似之处,std::vector< data_base*> stuff;
因为vector
它也是一个模板类。
如您所知,要声明类型向量,请将类型放在向量的尖括号内。所以,现在试试这个,你知道如何使用特定的数据类型声明你的类的一个版本:
std::vector<data<int>> MyVector;
你看到逻辑了吗?
然而,有一个问题:这不会在大多数 C++ 编译器上编译,但这不是因为你犯了一个逻辑错误。这是因为>>
末尾没有被识别为类型声明的一部分 - 它被视为其他东西(>> 有另一个含义。我相信这种情况下的这个问题在最新的 C++ 规范中得到了修复。)要解决这个问题,强制编译器通过添加空格来正确解析它:
std::vector<data<int> > MyVector;
空格通常对编译器解析源代码无关紧要,但在这里它确实如此。
现在你有了一个使用整数的数据类的向量。
要了解如何使用向量,我建议将此页面作为一个很好的参考。但是一个快速的概述是,您使用push_back()
将项目附加到向量,并且可以使用数组索引,即[]
通过索引访问特定元素,从第一个元素开始,从 0 开始,并用于size()
知道它包含多少个元素:
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.
请注意,MyDataObject
和MyVector
都分配在堆栈上,因此当它们超出范围时它们将被销毁(声明每个的方法或块 - 块是一个{...}
部分 - 结束。)您也可以在堆上分配,并存储指向向量中的基础对象的指针。如果您想知道如何做到这一点,请发表评论 - 我可以扩展答案。
哦,如果有人知道关于使用基类/派生类的好教程,我真的可以使用它
请每个问题只问一个问题。这有助于保持网站井井有条。此外,与您的第一个问题不同,我认为这是您可以轻松研究的问题。但是,如果您遇到问题,请随时在这里提出另一个问题。
但是这里有一个明显的错误。您的数据代码(您的派生类)具有以下构造函数:
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 for member.) 这将导致:
template <typename T>
data<T>::data(T &data, std::string &id) :
data_base(id), // call parent constructor
m_data(data)
{ }
并更改声明以匹配(并类似地更改基类。)尝试命名事物,以便您至少可以区分类型、局部变量和成员变量。