вектор c ++ в классе - программа segfault

0

Программа компилирует asis. И segfaults, где отмечено.

/* 
 * 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() здесь и все, что он дает, это ошибка: "undefined reference to" NamesVector :: NamesVector() "во время компиляции.

В дополнение к этому я попытался заменить:

NamesVector * peopleList; с именами Vector 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. Есть идеи?

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

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

        return EXIT_SUCCESS;
}
  • 1
    Q: Вы пробовали пройти через отладчик версией, которая компилируется без ошибок (но, тем не менее, с ошибками)? Вы проверили, что и "человек", и "люди" являются действительными объектами в точке, где вы находитесь?
Теги:
c++11
vector
gcc

2 ответа

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().
0

peopleList просто объявлен, но не был создан. Следовательно, вы получаете ошибку сегментации, потому что пытаетесь разыменовать неинициализированный указатель. Вам нужно сделать NamesVector *peopleList = new NamesVector(); вместо.

Конечно, для этого вам нужно будет определить конструктор по умолчанию для NamesVector. Возможно, у вас уже есть что-то определенное, но вы не показывали его выше. (И, вероятно, почему вы получаете ошибку компилятора, о которой вы говорили, когда пытаетесь это сделать.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню