C++ 在其自己的类中创建对象的修改副本

c++ create a modified copy of an object inside its own class

本文关键字:创建对象 修改 副本 自己的 C++      更新时间:2023-10-16

我需要创建一个类,每次创建对象时,也会创建一个修改后的副本,并能够执行相同的方法来返回原始和修改之间的差异。 我已经创建了此示例,但它不起作用:

#include <iostream>
class Box
{
public:
double l, w, h;
double vol, surf;
double getVol(){return l*w*h;};
double getSurf(){return (l*w + l*h + w*h) *2;};
double getVolDiff()
{
boxTemp->l = l+1;
boxTemp->w = w;
boxTemp->h = h;
return getVol() - boxTemp->getVol();
};
private:
Box* boxTemp;
};
int main(int argc, const char * argv[]) {
Box box;
box.l = 1;
box.w = 2;
box.h = 3;
std::cout << "Vol: " << box.getVol() << std::endl;
std::cout << "Surf: " << box.getSurf() << std::endl;
std::cout << "Vol Diff: " << box.getVolDiff() << std::endl;
return 0;
}

这个例子在方法getVolDiff中给了我一个错误。你能帮我解决这个问题吗?

编辑抱歉,如果我没有指定错误,但这是一个运行时错误,我没有从编译器获得任何信息。

如果您没有任何好的用途,请转储指针并改用本地框。

double getVolDiff() {
Box boxTemp; // temp, no allocation
boxTemp.l = l+1;
boxTemp.w = w;
boxTemp.h = h;
return getVol() - boxTemp.getVol();
}

添加构造函数将简化您的代码

Box(double l, double w, double h) : l(l), w(w), h(h) {}
double getVolDiff() {
Box boxTemp(l+1, w, h); // temp, no allocation
return getVol() - boxTemp.getVol();
}

如果我理解正确,_instance是用于未更改的原始对象(单例(,也可以更新临时对象(boxTemp(

#include <iostream>
class Box
{
public:
double l, w, h;
double vol, surf;
double getVol() { return l*w*h; };
double getSurf() { return (l*w + l*h + w*h) * 2; };
double getVolDiff()
{
boxTemp->l = l + 1;
boxTemp->w = w;
boxTemp->h = h;
return getVol() - boxTemp->getVol();
};
static Box* getInstance() {
if (_instance == 0) {
_instance = new Box;
}
return _instance;
}
void setTemp(Box *b1) {
boxTemp = b1;
}
private:
Box* boxTemp;
static Box *_instance;
};
Box* Box::_instance = 0;
int main(int argc, const char * argv[]) {

Box box;
box.l = 1;
box.w = 2;
box.h = 3;
std::cout << "Vol: " << box.getVol() << std::endl;
std::cout << "Surf: " << box.getSurf() << std::endl;
Box *orj = Box::getInstance();
orj->l = 4;
orj->w = 5;
orj->h = 6;
std::cout << "*** Vol: " << box.getVol() << std::endl;
std::cout << "*** Surf: " << box.getSurf() << std::endl;
orj->setTemp(&box);
std::cout << "Vol Diff: " << orj->getVolDiff() << std::endl;
return 0;

}