【发布时间】:2018-12-29 07:24:47
【问题描述】:
为什么第一次调用cout后drawManifestoGlobal中的值会发生变化?看起来 canvas.panel.drawManifestoGlobal 被破坏了 - 为什么?
我该如何解决这个问题?
#include <iostream>
class DrawManifestoGlobal {
public:
int value = 2;
};
class Panel {
public:
void setDrawManifestoGlobal(DrawManifestoGlobal & _drawManifestoGlobal);
DrawManifestoGlobal * drawManifestoGlobal;
};
class Canvas {
public:
Canvas() {};
Canvas(DrawManifestoGlobal _drawManifestoGlobal);
DrawManifestoGlobal drawManifestoGlobal;
Panel panel;
};
class SerDe {
public:
Canvas doSerDe();
};
Canvas SerDe::doSerDe() {
DrawManifestoGlobal drawManifestoGlobal;
drawManifestoGlobal.value = 99;
Canvas canvas(drawManifestoGlobal);
return canvas;
}
Canvas::Canvas(DrawManifestoGlobal _drawManifestoGlobal) {
drawManifestoGlobal = _drawManifestoGlobal;
panel.setDrawManifestoGlobal(drawManifestoGlobal);
}
void Panel::setDrawManifestoGlobal(DrawManifestoGlobal &_drawManifestoGlobal) {
drawManifestoGlobal = &_drawManifestoGlobal;
}
int main () {
SerDe serde;
Canvas canvas;
canvas = serde.doSerDe();
std::cout << canvas.panel.drawManifestoGlobal->value << std::endl; // prints 99
std::cout << canvas.panel.drawManifestoGlobal->value << std::endl; // prints 0 (!!!)
}
关于实现要求:Canvas 拥有 Panel 和 DrawManifestoGlobal,并且 Panel 本身具有指向 Canvas 的 DrawManifestoGlobal 的指针,因此从 Canvas 发生的任何更改对 Panel 都是可见的。
【问题讨论】:
标签: c++ function pointers object return