0

我有代码:

我的载体:std::vector<spreadsheet> spreadsheets;

//create a new spreadsheet if it doesn't already exist. Link the session to the spreadsheet.
bool server::createSpreadsheet(session* session, std::string name, std::string password)
{
    std::cout << "beginning" << std::endl;

    bool found = false;
    for(int i = 0; i < spreadsheets.size(); i++)
    {

      spreadsheet test = spreadsheets.at(i);
      std::cout << "spreadsheet name = " << &test << std::endl;
      if(spreadsheets.at(i).name == name) //spread sheet already exists
      {
          found = true;

      }
    }
    std::cout << "After For found = " << found << std::endl;

    if(!found) //create a spreadsheet
    {
      spreadsheet * spr = new spreadsheet(name, password);
      spr->linkSession(session);
      spreadsheets.push_back(*spr);
    }
    else
    {
      std::cout << "in else" << std::endl;
      return false;
    }
    return true;
}

我希望这会每次都创建一个新的电子表格对象found并将false其放置在向量中。但是根据我得到的输出,它似乎每次都放同一个对象?我不知道这里发生了什么?

运行多次后输出:

beginning
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
4

3 回答 3

5

您将电子表格复制到局部变量。然后输出局部变量的地址。

如果您想在向量本身中输出电子表格的地址,您可以执行以下操作:

std::cout << "电子表格名称 = " << &spreadsheets[i] << std::endl;

于 2013-04-21T05:27:56.593 回答
1
spreadsheet test = spreadsheets.at(i);

是复制初始化。这意味着test创建了一个新的电子表格对象,并将其中的任何内容按spreadsheets.at(i)复制到其中

然后你不断地获取新test对象的地址。不是向量中值的地址。

并且范围test在 for 循环内。因此,编译器在每次迭代时都会将其分配在相同的地址中,并向您显示相同的地址。

如果您想要其中的地址,at(i)spreadsheets必须直接获取其地址

std::cout << "spreadsheet name = " << &spreadsheets.at(i) << std::endl;
于 2013-04-21T05:27:45.997 回答
1

似乎每次都放同一个物体?

不,只是临时的局部变量 ( test) 位于内存中的一个特定位置,当然该地址不会改变。您必须检查对象的内容才能区分它们。

此外,您使用的方式vector至少new是非常错误的。您正在推回已分配的电子表格对象的副本new多余地调用复制构造函数,然后您松开指向原始对象的指针,泄漏内存。当您从向量中检索对象时,您将再次复制它。为什么不使用参考?

spreadsheet spr(name, password);
spr.linkSession(session);
spreadsheets.push_back(spr); // this copies too, but at least only once

// ...

/* optionally: const */ spreadsheet &test = spreadsheets.at(i);

此外,鼓励使用迭代器遍历向量:

for (vector<spreadsheet>::iterator it = spreadsheets.begin(); it != spreadsheets.end(); it++) {
    // use `*it` to access the current element
}
于 2013-04-21T05:32:26.523 回答