Hej, już od dobrych kilku dni męczę się z unique_ptr, sprawa wygląda następująco:
chce na obiekcie określonej klasy wywołać metodę virtualną buildAST a następnie w tej metodzie przypisać startSymbolowi ten wskaźnik na którym została wywolana metoda buildAST :
void AbstractExpression::creatAST()
{
tmp = parser->parse(); //parse() zwraca unique_ptr na obiekt określonej klasy
while (tmp)
{
tmp->buildAST();
tmp = std::move(parser->parse());
}
}
template<typename T>
void Number<T>::buildAST()
{
if (not startSymbol)
{
std::unique_ptr<Number<T>> tmp2 = std::make_unique<Number<T>>(this->getValue());
this->startSymbol= std::move(tmp2)); //działa, przypisuje się ale po wyjściu z powrotem startSymbol jest pusty czyli wychodzi jakby został wywołany destruktor a tego nie chce jak to zmienić ?
}
}
class AbstractExpression
{
protected:
Parser *parser;
std::unique_ptr<AbstractExpression> startSymbol;
std::unique_ptr<AbstractExpression> leftNode;
std::unique_ptr<AbstractExpression> rightNode;
std::unique_ptr<AbstractExpression> tmp;
//inne metody w tym buildAST();
}
Metoda buildAST() przypisuje startSymbolowi odp unique_ptr ale tylko wewnątrz jej ciała, po powrocie z powrotem do buildAST() i linijki chociażby tmp=std::move(parser.parse()); startSymbol jest pusty; jak sprawić aby nie był wywołany destruktor uniqe_ptr wewnątrz metody wirtualnej buildAST()? Czy może problem tkwi gdzie indziej? Jak sprawić aby startSymbol ustawiał się w klasie AbstractExpression a nie 'znikał';
Z góry dziękuję za odpowiedź lub jakąkolwiek wskazówkę!
Pozdrawiam A
Number
dziedziczy poAbstractExpression
.