【问题标题】:C++ Template ClassC++ 模板类
【发布时间】:2011-07-14 06:04:22
【问题描述】:

嘿.. 我在做一些家庭作业时遇到了麻烦。

我们正在研究 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&lt;&lt; vector[i]&lt;&lt; endl; 打印出矢量..

问题是我遇到各种错误和段错误。

我不明白如何访问函数中的向量, 以及如何访问其元素。

这是一个头文件,主要我们声明一个VectorList&lt;NODETYPE&gt; IntVector的对象...

那么我该怎么做呢? 任何有助于理解*vList 在这里如何发挥作用的帮助都会有很大帮助 我应该能够完成剩下的..

另外,对于isEmpty(),我假设我可以使用vList.empty().. 但是因为vList 是一个指针.. 效果不太好。

== 对于构造函数/析构函数,我能做什么? 我知道对于析构函数,我应该遍历向量并在每个元素上使用 delete。 但是应该

请给我解释一下,我很沮丧=[

【问题讨论】:

  • 添加了homework标签但删除了printing标签,因为系统只允许5个标签。
  • 永远不要在头文件中使用 using namespace 声明,这将强制 std 命名空间进入您的所有用户,这可能会导致代码中的名称冲突。
  • 几乎所有问题都来自尝试使用指向向量的指针。如果您将向量直接存储在您的类中,那么大多数其他事情都会起作用!

标签: c++ class templates function


【解决方案1】:

我的问题是当我不明白如何使用 STL 有 *vList.. 它是指向第一个向量元素的指针吗?

我假设作为作业的一部分,您需要使用指向向量的指针而不是向量本身。通常,我从不使用指向容器的指针。事实上,我在从 C 切换到 C++ 的过程中发现的最好的事情是,我可以在没有指针的情况下编写整个程序,这要归功于 STL 编程。除非你需要使用指向向量的指针,否则我建议你直接使用向量。

当然,使用正确的向量比使用指针更容易,但不用担心。使用指针还不错。

首先,为了使用指向-something 的指针,必须分配something。所以,在你的构造函数中,调用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); }

有一个快捷操作符-&gt; 使上面的内容更易于阅读:

void insertAtFront(const NODETYPE& node) { vList->push_front(node); }

表达式x-&gt;y 或多或少等价于(*x).y

总结一下:

new 在你的构造函数中分配你的vList。用delete 在你的析构函数中销毁你的vList。使用(*vList).function()vList-&gt;function() 调用vList 的成员。

祝你好运,如果您有其他问题,请回来!

附:由于您有一个重要的析构函数,因此您需要考虑rule of three

P.P.s.你说了一些关于在你的析构函数中迭代向量并删除你在那里找到的每个对象。如果您的数据类型是指向 NODETYPE 的指针的向量(与您声明的相反:NODETYPE 的指针指向向量),您只需要这样做。除非您完全习惯了指针,否则我建议您永远不要将指针存储在 STL 容器中。

【讨论】:

  • @Nawaz :不要给我-1,把它给 OP 的教授。我只是在展示如何去做他显然被分配去做的事情。
  • 您至少应该告诉他,在不需要时使用指向向量的指针是个坏主意。如果你这样做,我会投赞成票!
  • 我以为我有,但现在我看到警告很弱。我已经加强了帖子中的警告。致 OP:我从不使用指向容器的指针,也从不使用指针容器。我建议你也不要这样做,除非你明白为什么。
【解决方案2】:

你应该在构造函数中构造你的对象(如果你真的需要使用裸指针):vList = new vector&lt; NODETYPE &gt;();,在析构函数中释放内存:delete vList;,将你的方法转换为容器类的相应方法。例如,insertAtBack 将被实现为 vList-&gt;push_back(elem);

【讨论】:

  • 如你所见,我提到它只是因为在作业中这样指定。我也不会做这样的指针混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多