2013-10-27 41 views
0

程序編譯asis。並注意到段錯誤。類中的C++向量 - 程序段錯誤

/* 
* Testing of Vectors. 
* Uses c++11 standard. 
* gcc version 4.7.2 
* compile with : g++ -std=c++11 -o vec vec.c++ 
*/ 

#include <iostream> 
#include <string> 
#include <vector> 
#include <stdio.h> 
#include <unistd.h> 

using namespace std; 

此課程正常工作。

/* declare Person class. */ 
class Name { 
       std::string first; 
       std::string last; 
     public: 

     Name(void); 
     Name(std::string first, std::string last){ 
       this->first = first; 
       this->last = last; 
     } 
     ~Name(); 

     std::string GetFirstName(){ 
       return this->first; 
     } 

     std::string GetLastName(){ 
       return this->last; 
     } 
}; 

這個班是我遇到問題的地方。

/* declare NamesVector class. */ 
class NamesVector { 
       std::vector<Name *> person_list; 
     public: 

     NamesVector(void); 
     ~NamesVector(void); 
     virtual Name *getPerson(void); 
     virtual void addPerson(Name *); 
     virtual void Print(void); 
     virtual void FindPerson(std::string); 
}; 

/* adds person to vector/list */ 
void NamesVector::addPerson(Name *n){ 
     person_list.insert(person_list.begin(), n); 
}; 

/* prints all persons */ 
void NamesVector::Print(){ 
     for (auto v: person_list){ 
       std::cout << v->GetFirstName() << 
       " " << v->GetLastName() << std::endl; 
     } 
}; 

/* main() */ 
int main(int argc, char **argv){ 

我已經試過:NamesVector * NV =新NamesVector()來乍到,它給人的 的錯誤: 編譯 ')未定義參考`NamesVector :: NamesVector('。

除此之外,我試過替換:

NamesVector * peopleList;與NamesVector peopleList;

(並取得相應的改變的代碼需要的地方。)

,並獲得在編譯時出現以下錯誤:

未定義的參考`NamesVector :: NamesVector()」

未定義參考`NamesVector ::〜NamesVector()

 /* pointer to person list */ 
     NamesVector *peopleList; 

     /* pointer to a person */ 
     Name *person; 

     /* instanseate new person */ 
     person = new Name("Joseph", "Heller"); 

     /* works ok */ 
     std::cout << person->GetFirstName() << " " 
     << person->GetLastName() << std::endl; 

這裏是程序段錯誤的地方。有任何想法嗎?

 /* segfaults - Why!?! - insert into peopleList vector */ 
     peopleList->addPerson(person);  

     peopleList->Print(); 
     std::cout << std::endl << std::endl; 

     return EXIT_SUCCESS; 
} 
+1

問:您是否嘗試過通過調試器行走,編譯乾淨(但仍然段錯誤)的版本?您是否驗證過「人」和「人」是您在段錯誤點的有效對象? – paulsm4

回答

0

peopleList僅僅被聲明,但尚未實例化。因此,由於您試圖取消引用未初始化的指針,您會遇到分段錯誤。您需要改爲NamesVector *peopleList = new NamesVector();

當然,要做到這一點,您必須爲NamesVector定義默認構造函數。您可能已經在某處定義了它,但您沒有在上面顯示它。 (這可能是爲什麼當您嘗試,讓你提到的編譯器錯誤。)

1

你必須定義一個構造函數和類NamesVector析構函數:當您定義構造函數和析構函數

// constructor  
NamesVector::NamesVector() { 

    // create an instance of the vector 
    person_list = new Vector<Name *>(); 

} 

// destructor 
NamesVector::~NamesVector() { 

    // delete the instance of the vector 
    delete person_list; 
} 

,你應該能夠調用:

NamesVector *nv= new NamesVector().