类中的c ++向量 - 程序段错误

时间:2013-10-27 03:51:59

标签: c++ gcc c++11 vector

该程序编译asis。还有段落错误。

/* 
 * 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 = new NamesVector()在这里,它给出的是 错误:'未定义引用`NamesVector :: NamesVector()'while 编译。

除此之外我还尝试过更换:

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

2 个答案:

答案 0 :(得分: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().

答案 1 :(得分:0)

peopleList仅被声明但尚未实例化。因此,您会遇到分段错误,因为您尝试取消引用未初始化的指针。您需要改为NamesVector *peopleList = new NamesVector();

当然,要做到这一点,您必须为NamesVector定义默认构造函数。你可能已经在某处定义了这个,但是你没有在上面显示它。 (这可能就是你在尝试时遇到编译器错误的原因。)