[英]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.