2013-12-06 3 views
-1

Да, я искал, но я не могу найти ответ. У меня есть вектор, который является членом класса. Этот вектор задает некоторые значения (в данном случае только 1) в конструкторе класса. Как только конструктор закончен, вызывается деструктор объектов в векторе.C++: элементы-элементы уничтожены после вектора, заполненного в конструкторе класса

Вот короткий и сладкий вариант того, что я имею дело с

test.h

Class test 
{ 
    private: 
    Vector<Sprite> sprites; 
    public: 
    test(item _something); 
} 

test.cpp

test::test(item _something); 
{ 
    sprites.emplace_back(_device, tBank["TestTexture"]); 
} 

main.cpp

test testItem; 

main() 
{ 
    testItem = testItem(something); 
    // This is where the destructor for sprite is called 
} 

Я знаю, что код выше не работает bu t это сокращение того, что происходит. Я могу отправить все это, если потребуется. В любом случае я делаю что-то сумасшедшее?

+0

Это что, std :: vector? Почему ключевое слово класса занимает верхний регистр? – elimirks

+2

Я предполагаю, что вы имеете в виду 'testItem = test (что-то);'? А что такое 'Vector' (верхний регистр V)? Пожалуйста, отправьте сообщение [SSCCE] (http://sscce.org) – Praetorian

+1

Вы должны скопировать реальный код и убедиться, что он действителен (где тип возврата 'main'?) –

ответ

2

Во-первых, я полагаю, с testItem(something) вы на самом деле означает test(something) (существует целый ряд других очевидных ошибок, например, main() необходимость вернуть int, то есть, по-видимому, это не реальный код).

При назначении временного объекта, созданного с помощью test(something), testItem объект копирует или переносит присвоенный на testItem и, далее, временный разрушается. У компилятора нет другого выбора. Содержащиеся std::vector<Sprite> могут быть перемещены, если в классе test нет конструктора копий или копирования. Поскольку это не настоящий код, трудно сказать.

+0

ОК, похоже, что это может быть то, что происходит. Поскольку нет никакого способа обойти эту проблему, так как часть спрайта - это DirectX \t \t LPD3DXSPRITE, который разрушает деструктор, что означает, что указатель копий (или оригинальный, в зависимости от того, что сохранится) заканчивается тем, что не вызывает ничего, если вызывается деструктор. –

0

Что вы испытываете, как ожидается:

Type t; 
t = Type(arg); 

Вторая строка создает объект типа Type с заданными аргументами, он затем присваивает его переменной t. В конце полного выражения временное уничтожается.

+0

Спасибо, имеет смысл. Я не уверен, как мне обойти это. –

Смежные вопросы