Программа компилирует 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;
}
Вы должны определить конструктор и деструктор для класса 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().
peopleList
просто объявлен, но не был создан. Следовательно, вы получаете ошибку сегментации, потому что пытаетесь разыменовать неинициализированный указатель. Вам нужно сделать NamesVector *peopleList = new NamesVector();
вместо.
Конечно, для этого вам нужно будет определить конструктор по умолчанию для NamesVector. Возможно, у вас уже есть что-то определенное, но вы не показывали его выше. (И, вероятно, почему вы получаете ошибку компилятора, о которой вы говорили, когда пытаетесь это сделать.)