c ++使用输入参数作为输出

时间:2013-12-08 19:35:41

标签: c++

这是我的情况:

    void Database::execute(string query, Table *outTable) {

        //some code

        if (isSelect) {
            outTable = new Table(rowCount, columnCount);
        }

        // some code

    }

我的想法是函数execute对db执行查询。如果查询产生表(例如选择),我分配outTable。 无论如何,在执行这个函数之后,当我尝试在调用函数中对outTable做一些事情时,我得到一个段错误。我已经检查过该函数是否使用命令new执行该行。 这有什么不对?

以下是我在调用函数时所做的事情:

Database d = new Database("mydb");    
Table *t;
d.execute("SELECT * FROM TABLE1", t);
int n = t->rowCount(); //here I get the segfault

3 个答案:

答案 0 :(得分:1)

参数是函数的局部变量。因此,在您的情况下,不会更改表的原始指针。仅更改函数的局部变量。通过引用传递此参数或使用指针再应用一个间接。例如

void Database::execute(string query, Table * &outTable);
d.execute("SELECT * FROM TABLE1", t);

void Database::execute(string query, Table * *outTable);
d.execute("SELECT * FROM TABLE1", &t);

答案 1 :(得分:1)

Table *outTable是execute函数的本地,它是传入的变量的副本,因此调用函数中的Table指针不会在execute中分配任何内容。

如果您只是在调用函数中打印表指针的地址,然后在执行本身内打印outTable的地址(通过不取消引用指针),则可以验证这一点。

答案 2 :(得分:1)

问题是你正在传入一个指针 - 输入变量是函数的本地变量。所以你需要获取meta并传递你想要存储输出值的指针的地址,或者使用引用(有点实现为带有契约的指针,语言将尝试确保传递具体值)

最后值得注意的是:

 bool Database::execute(const std::string& query, Table& into)

这样可以避免将查询复制到本地执行的临时字符串中,并允许调用者为您提供一个由您的函数填充的表。

编写了其中一些,您可能需要考虑使用bool来表明查询是否成功:)

Table myTable;
bool success = d.execute("SELECT 'fail' FROM DUEL", myTable);
if (!success)
    herp();

有关指针的更多信息,请参阅我之前对非常相似问题的回答:Pointer errors in the method of transmission(c++)