我有代码:
我的矢量: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
答案 0 :(得分:5)
您将电子表格复制到本地变量。然后输出局部变量的地址。
如果您想在矢量中输出电子表格的地址,您可能会这样做:
std :: cout&lt;&lt; “电子表格名称=”&lt;&lt; &amp; spreadsheets [i]&lt;&lt;的std :: ENDL;
答案 1 :(得分: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;
答案 2 :(得分: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
}