Задать вопрос
@pixik

Куда деваются объекты в std::vector??

Доброго времени!
Есть класс singleton, в котором находится
// Файл singleton.h
class singleton{
... // вся кухня с инициализацией singleton

private:
... 
std::vector<someclass *> vect;
std::vector<someclass * >  initVector();
};

В конструкторе класса я заполняю vect объектами:
// Файл singleton.cpp
singleton::singleton()
{
	this->vect = singleton::initVector();
}


std::vector<someclass * >  singleton::initVector(){
    std::vector<someclass * > _vect;
    for (int i = 0; i < 4; i++){ _vect.push_back( new someclass()); }
    return _vect;
}


Во время инициализации вектор наполняется, но после того, как объект singleton сформировался (после выхода из конструктора), в vect остается только пустой вектор vect (size = 0).
не понимаю, куда делись объекты, добавленные в конструкторе singleton ?

У класса someclass конструктор по умолчанию определен. Использую MSVS 2013 в mfc проекте.
Спасибо!
  • Вопрос задан
  • 2417 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@onepavel
Консультация и разработка мобильных приложений
Вы создали vector в стеке и пытаетесь объект вернуть из метода по значению.
Возвращая данные по значению они копируются, не так ли ? Походу создается новый пустой вектор,
который присваивается вашей переменной. А _vect благополучно умирает не выходя из области видимости
метода. Стоит почитать www.e-reading.link/book.php?book=1002058
Ответ написан
@pixik Автор вопроса
one pavel: Вы создали vector в статической памяти и пытаетесь объект вернуть из метода по значению.
Возвращая данные по значению они копируются, не так ли ? Походу создается новый пустой вектор,
который присваивается вашей переменной. А _vect благополучно умирает не выходя из области видимости
метода.


Возвращая данные по значению они копируются, не так ли ?

Копируются конечно. оператор = перегружен для этих целей.

На самом деле вопрос немного меняется. Я вызывал конструктор из конструктора:
singleton::singleton(){
	singleton::singleton(600, 400);
}

А инициализация vect была тут:
singleton::singleton(int , int)
{
  this->vect = singleton::initVector();
}


Я думал, что это не существенно, но вот так получилось то, что нужно:
// Файл singleton.h
class singleton{
... // вся кухня с инициализацией singleton

private:
... 
std::vector<someclass *> * vect;
std::vector<someclass * >  *initVector();
};

// Файл singleton.cpp
singleton::singleton(){
	this->vect = *this->initVector();
}

std::vector<someclass* > * singleton::initVector(){
	std::vector<someclass* >  * vect = new std::vector<someclass* >();
	for (int i = 0; i < 4; {	_vect->push_back(new someclass()); }
	return _vect;
}


Спасибо за книгу! Я уже не один десяток раз на неё натыкался. В ближайшее время изучу:)
Ответ написан
yagorik
@yagorik
C++ Developer
Вызов конструктора из конструктора доступен только С++11/14
И в вашем случае он должен выглядеть как-то так:
singleton::singleton() : singleton(600, 400)
{}



На самом деле вопрос немного меняется. Я вызывал конструктор из конструктора:
singleton::singleton(){
  singleton::singleton(600, 400);
}

То что вы написали работает иначе, в этой строке singleton::singleton(600, 400); создаётся безымянный локальный объект singleton, который будет удалён после выхода из тела вызывающего конструктора.
Ответ написан
Комментировать
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
У вашего singleton потомки есть? Потому что пока что я не вижу, что вам ногу отстреливает, нужно больше кода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы