qgis — указатель на объект производного класса

следующая проблема:
Я хочу построить функцию, которая возвращает мне указатель на производный объект из абстрактного класса. Я думаю, память освобождается, когда функция остается, потому что я получаю ошибку alloc. Но я не могу вернуть объект, потому что класс абстрактный. В функции я решаю, какой производный класс будет иметь объект. Как я могу решить проблему?
Любая идея?

QgsSymbolV2* QGISFunc::ReadClassSymbolsXML(QString FeatureType, QXmlStreamReader &reader)
{
QgsMarkerSymbolV2* p_mlmSymbol=0;
try
{
QgsLineSymbolV2 mllSymbol;
QgsFillSymbolV2 mlfSymbol;
QgsMarkerSymbolV2 mlmSymbol;
...
return &mlmSymbol; // alloc error

0

Решение

Ваша проблема не имеет ничего общего с абстрактным классом. Вы создаете объект в стеке, а затем возвращаете его адрес. Этот адрес, однако, больше не будет действительным после возврата функции. Если вы действительно хотите вернуть указатель и передать право собственности вызывающей стороне, почему бы не создать его в куче с помощью new? Не забудь delete хотя позже, когда вы закончите с этим объектом или рассмотрите умные указатели, как подсказывает @AndyProwl.

1

Другие решения

Вы возвращаете адрес переменной с автоматическим хранением. Этот объект уничтожается, когда функция возвращается. Решение состоит в том, чтобы разместить объект в куче. Я предлагаю использовать умный указатель (unique_ptr или же shared_ptr в комбинации с make_shared<>()) и верните умный указатель.

std::shared_ptr<QgsSymbolV2> QGISFunc::ReadClassSymbolsXML(
QString FeatureType,
QXmlStreamReader &reader
)
{
try
{
...
std::shared_ptr<QgsSymbolV2> spObj = make_shared<QgsMarkerSymbolV2>();
...
return spObj;
}
...
}
2

По вопросам рекламы [email protected]