У меня есть следующий фрагмент кода:Вектор объектов как статический член класса
class Person {
std::string name_;
std::string surname_;
//static vector<???> tracer_;
public:
Person(std:: string name, std::string surname)
: name_(name)
, surname_(surname) {
//something with tracer_
}
~Person() {
//something with tracer_
}
static void OutputPersons(std::ostream& out) {
//print every element in tracer_
}
};
class Worker {
Person person_;
std::string position_;
public:
Worker(const Person& person, std::string position)
: person_(person)
, position_(position) {
}
};
То, что я хочу добиться, чтобы напечатать все экземпляры объектов класса Person (имя и фамилию, без позиции от класс рабочий), который существует в определенный момент, так что в примере
Person s("aaa", "bbb");
Person t("ccc", "ddd");
{
Person u("eee", "fff");
}
Worker w(Person("ggg","hhh"),"guard");
Person::OutputPersons(std::cout);
должен печатать только
aaa bbb
ccc ddd
ggg hhh
как только эти объекты существуют в момент вызова Person :: OutputPersons.
Что я не знаю, как проецировать поля класса Person. Как вы видите, я пытался создать статический вектор, который должен «трассировать» все объекты Person - с добавлением элемента в конструктор и удалением в деструкторе. У меня только проблема с типом элементов в этом векторе, так как я не могу поместить туда никакого указателя на объект класса Person.
EDIT:
Как я получаю знать, что это законно, чтобы иметь вектор Person *, я изменил мой код
class Person {
std::string name_;
std::string surname_;
static std::vector<Person *> tracer_;
public:
Person(std:: string name, std::string surname)
: name_(name)
, surname_(surname) {
tracer_.push_back(this);
}
, но я получаю ошибку «неопределенная ссылка на«Человека :: tracer_ ». Что я делаю неправильно?
Почему бы и нет? std :: vector - совершенно законный тип. –
Или 'std :: vector'. Указатель, который вам нужен, это 'this'. –
leewz
Насколько корректно использовать указатель на класс A в качестве члена класса A? Я этого не знал, но если это правда, моя проблема решена. –