gpt4 book ai didi

c++ - 模板类的 vector ?

转载 作者:行者123 更新时间:2023-11-30 02:54:47 25 4
gpt4 key购买 nike

我的一小部分代码有问题,我正在尝试使用模板和模板类的 vector
一位 friend 帮助我编写了以下代码,使其达到了可以编译的状态,但是我仍然不能很好地使用派生类,所以我完全迷路了,我无法克服这个小错误,我真的可以使用你的帮助

   #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;
}

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

最佳答案

How would one go around using the data class and putting it in stuff vector, and accessing it later?

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

要创建模板化数据类的单个实例,您可以在尖括号中使用希望它使用的类型声明它:

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

您可能会发现与 stuff 声明的相似之处: std::vector< data_base*> stuff;因为vector也是一个模板类。

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

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

你明白逻辑了吗?

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

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

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

现在您有一个使用整数的数据类 vector 。

要阅读有关使用 vector 的信息,我推荐 this page as a good reference .但快速概览是您使用 push_back()将一个项目附加到 vector ,并可以使用数组索引,即 [] , 按索引访问特定元素,从第一个元素的 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.

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

Oh, and if anyone would know a good tutorial about using base/derived classes, I could really use that

每个问题请只问一个问题。这有助于保持站点的组织性。此外,与您的第一个问题不同,我认为这是您可以轻松研究的问题。但如果您遇到问题,请随时在这里提出另一个问题。

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

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++ - 模板类的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com