[英]C++ Template Class
嘿..我在做作业时遇到麻烦。
我们正在研究VectorList(有点像链表,但带有向量-不要问为什么。。)无论如何我都有这样的东西:
#ifndef VECTORLIST_H
#define VECTORLIST_H
#include <iostream>
#include <vector>
using namespace std;
template< typename NODETYPE >
class VectorList
{
public:
VectorList(); // constructor
~VectorList(); // destructor
void insertAtFront( const NODETYPE & );
void insertAtBack( const NODETYPE & );
bool removeFromFront( NODETYPE & );
bool removeFromBack( NODETYPE & );
bool isEmpty() const;
void print() const;
private:
vector< NODETYPE > *vList; // list data as a vector
};
我需要填写函数..我的问题是,当我拥有* vList ..它是第一个向量元素的指针时,我不理解如何使用STIL?
// display contents of VectorList
template< typename NODETYPE >
void VectorList< NODETYPE >::print() const
{
// Fill in the missing code
}
我的想法是在向量上使用for循环,并使用cout<< vector[i]<< endl;
打印矢量。
问题是我遇到各种各样的错误和段错误。
我不了解如何访问函数中的向量以及如何访问其元素。
这是一个头文件,主要是我们声明一个VectorList<NODETYPE> IntVector
对象...
那我该怎么做呢? 理解此*vList
在这里如何发挥作用的任何帮助都会有很大帮助,我可能可以完成其余的工作。
另外,对于isEmpty()
,我假设我可以使用vList.empty()
..但由于vList是一个指针..它不能很好地工作。
==对于构造函数/析构函数,我该怎么办? 我知道对于析构函数,我应该遍历向量并在每个元素上使用delete。 但是应该
请给我解释一下,我很沮丧= [
我的问题是当我拥有* vList ..它指向第一个向量元素的指针时,我不理解如何使用STL?
我假设您被要求作为作业的一部分来使用指针到向量而不是向量本身。 通常,我从不使用指向容器的指针。 实际上,我发现从C切换到C ++的最好之处在于,借助STL编程,我可以编写完全没有指针的程序。 除非需要使用指向向量的指针,否则建议您直接使用向量。
当然,正确使用向量比使用指针更容易,但是不用担心。 使用指针还不错。
首先,为了使用指向事物的指针,必须分配事物 。 因此,在构造函数中,调用new
。
vList = new std::vector<NODETYPE>;
每当我们调用new
,我们都必须在某处具有匹配的delete
。 由于new
是在构造函数中,因此我们需要在析构函数中调用delete
:
delete vList;
你说:
但是由于vList是一个指针..它不能很好地工作。
这是生活变得轻松的地方。 通常,如果p
是指向某种类型的指针,则(*p)
是p
指向的对象。 这里有些例子:
int i = 1;
int *pInt = &i;
i = 4;
(*pInt) = 4;
std::cout << i << " " << (*pInt) << "\n";
std::vector<NODETYPE> v;
std::vector<NODETYPE> *pVector;
v.push_back();
(*pVector).push_back();
it = v.begin();
it = (*pVector).end();
因此,调用vList的成员很容易: (*vList).empty()
。
因此,您的代码可能是:
void insertAtFront(const NODETYPE& node) { (*vList).push_front(node); }
有一个快捷操作符->
使上面的内容更易于阅读:
void insertAtFront(const NODETYPE& node) { vList->push_front(node); }
表达式x->y
几乎等于(*x).y
。
总结一下:
用new
在您的构造函数中分配vList
。 使用delete
销毁析构函数中的vList
。 使用(*vList).function()
或vList->function()
调用vList的成员。
祝您好运,如果还有其他疑问,请回来!
Ps由于您有一个非平凡的析构函数,因此需要考虑3的规则 。
PPs您说了一些有关在析构函数中迭代向量并删除在其中找到的每个objetcs的事情。 如果您的数据类型是指向NODETYPE的指针矢量(与声明的内容相反:指向NODETYPE的指针),则只需要这样做。 除非您完全不喜欢指针,否则建议您不要将指针存储在STL容器中。
您应该在构造函数中构造对象(如果确实需要使用裸指针): vList = new vector< NODETYPE >();
,释放析构函数中的可用内存: delete vList;
,将您的方法转换为容器类的相应方法。 例如, insertAtBack
将实现为vList->push_back(elem);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.