我正在一个项目中,该项目代表了类似AST的树。由于涉及很多嵌套,因此我正在使用智能指针unique_ptr
来保存引用并避免复制。
问题描述。向量std::vector<std::unique_ptr<AbstractStatement>> blockStatements;
是Block
类的成员,该类代表代码块(例如,if语句的随后分支中的语句)。在将语句添加到Block
对象中之后,正如我可以使用CLion的调试器确认的那样,将它们正确添加到向量中。
但是,从函数generateAst
返回(请参阅main.cpp
)之后,向量意外为空。见下图:
将Function
传递到generateAst
并在此处进行修改。有关的blockStatements
向量被嵌入到Function
对象中,如下所示:
object Function
-- member std::vector<std::unique_ptr<AbstractStatement>> body;
----- object If
------- member AbstractStatement *thenBranch;
---------- object Block
------------ member std::vector<std::unique_ptr<AbstractStatement>> blockStatements;
--------------- (any AbstractStatement, e.g., VarAssignm [see main()])
Block
的实现方式如下:
// block.h --–----------------
class Block : public AbstractStatement {
public:
std::vector<std::unique_ptr<AbstractStatement>> blockStatements;
Block();
Block(std::vector<std::unique_ptr<AbstractStatement>> stat);
void addStatement(std::unique_ptr<AbstractStatement> &&statement);
};
// block.cpp --–----------------
Block::Block() = default;
void Block::addStatement(std::unique_ptr<AbstractStatement> &&statement) {
blockStatements.push_back(std::move(statement));
}
Block::Block(std::vector<std::unique_ptr<AbstractStatement>> stat) : blockStatements(std::move(stat)) {
}
我通过以下方式向blockStatements
添加元素(顺便说一句,使用addStatement
会导致元素丢失相同):
void generateAst(Function *pFunction) {
pFunction->name = "demoFunction";
FunctionParameter paramX("X", "int");
pFunction->addParameter(paramX);
Block thenBlock;
Variable varX("x");
auto assignXtoX = std::make_unique<VarAssignm>("x", &varX);
thenBlock.blockStatements.push_back(std::move(assignXtoX));
auto ifStmt = std::make_unique<If>();
ifStmt->thenBranch = std::move(&thenBlock);
pFunction->body.push_back(std::move(ifStmt)); // this doesn't seem to work
std::cout << "end of generateAst(...)" << std::endl; // f.body.at(0).thenBranch.size = 1 -> as expected
}
int main() {
Function f;
generateAst(&f);
std::cout << "finished!" << std::endl; // f.body.at(0).thenBranch.size = 0 -> why?!
return 0;
}