我遇到了一小部分代码的问题,我正在尝试使用模板和模板类的向量
一位朋友帮助我使用下面的代码,让它进入一个编译的状态,但我仍然不能很好地使用派生类,所以我完全迷失了,我无法克服这个小错误,我真的可以使用你的帮助
#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;
}
如何使用数据类并将其放入stuff向量中,以后再访问它? 哦,如果有人知道关于使用基类/派生类的好教程,我真的可以使用那个 提前致谢
答案 0 :(得分:2)
如何使用数据类并将其放入stuff向量中并稍后访问它?
实际上非常简单。让我们完成一些步骤。
要创建模板化数据类的单个实例,请使用您希望它在斜角括号中使用的类型声明它:
data<int> MyDataObject(0, "zero");
您可能会看到与stuff
:std::vector< data_base*> 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开始,并使用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
都在堆栈上分配,因此当它们超出范围时会被销毁(声明每个的方法或块 - 块是{{ 1}} section - ends。)您还可以在堆上进行分配,并将指针存储到向量中的基础对象。如果您想知道如何做到这一点,请发表评论 - 我可以扩大答案。
哦,如果有人知道关于使用基类/派生类的好教程,我真的可以使用
每个问题只能问一个问题。这有助于保持网站的有序性。此外,与您的第一个问题不同,我认为这是您可以轻松研究的问题。但如果你遇到麻烦,请随时在这里提出另一个问题。
但这里有一个明显的错误。您的数据代码(派生类)具有以下构造函数:
{...}
看到它初始化成员变量id,它属于data_base类。
你应该做的是从你的子构造函数调用祖先构造函数,因为它应该已经完成初始化template <typename T>
data<T>::data( T &_data, std::string &_id )
{
data =& _data;
id = _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_
并更改声明以匹配(并类似地更改基类。)尝试命名,以便至少可以区分类型,局部变量和成员变量。