函数返回后,空的std :: vector <unique_ptr <AbstractStatement >>

时间:2019-12-11 09:35:50

标签: c++ vector

我正在一个项目中,该项目代表了类似AST的树。由于涉及很多嵌套,因此我正在使用智能指针unique_ptr来保存引用并避免复制。

问题描述。向量std::vector<std::unique_ptr<AbstractStatement>> blockStatements;Block类的成员,该类代表代码块(例如,if语句的随后分支中的语句)。在将语句添加到Block对象中之后,正如我可以使用CLion的调试器确认的那样,将它们正确添加到向量中。 但是,从函数generateAst返回(请参阅main.cpp)之后,向量意外为空。见下图:

CLion debugger

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;
}

0 个答案:

没有答案