【发布时间】:2014-08-10 00:28:21
【问题描述】:
对于一个项目,我有一个对象列表(在我的示例代码中,一个花园)。每个花园都包含一个植物,它引用了它所在的花园。这在制作单个花园时非常有效,但是当我创建一个花园对象的 std::list 时,突然在某处创建了一个副本 em> 我不知道,我也不知道如何解决它。对象如下:
struct Garden; //Forward declaration
struct Plant {
Plant(Garden & myGarden) : theGarden(myGarden) { }; //Constructor
Garden & theGarden; //reference to garden this Plant is in
};
struct Garden {
Garden(int size) : thePlant(*this), size(size) { }; //Constructor
Plant thePlant; //Plant contained in this Garden
int size; //Size of this garden
};
到目前为止一切顺利。现在,我可以单独创建一个 Garden,或者将其放入列表中。预期的行为是,如果我更改“大小”变量,它会随处更改,在theGarden 中也是如此。但是,在列表中,它只会在“原始”Garden 中更改,而不是在参考 theGarden 中更改
int main() {
//Works
Garden oneGarden(1);
std::cout << "Expected: 1 1, result: "
<< oneGarden.size << " "
<< oneGarden.thePlant.theGarden.size << std::endl;
oneGarden.size = 2;
std::cout << "Expected: 2 2, result: "
<< oneGarden.size << " "
<< oneGarden.thePlant.theGarden.size << std::endl;
//Does not work!
std::list<Garden> gardenList;
gardenList.push_back(Garden(1));
std::cout << "Expected: 1 1, result: "
<< gardenList.front().size << " "
<< gardenList.front().thePlant.theGarden.size << std::endl;
gardenList.front().size = 2;
std::cout << "Expected: 2 2, result: "
<< gardenList.front().size << " "
<< gardenList.front().thePlant.theGarden.size << std::endl;
return 0;
}
最终输出如下:
Expected: 1 1, result: 1 1
Expected: 2 2, result: 2 2
Expected: 1 1, result: 1 1
Expected: 2 2, result: 2 1
【问题讨论】:
-
当花园被复制时,它们的植物将始终参考原始花园。这就是引用的工作方式。不能让它们指向其他东西。
-
鉴于“突然在我不知道的地方创建了一个副本”,问题真的是副本在哪里吗?
标签: c++ list oop reference std