2017-07-31 57 views
0

我需要創建一個類,每次創建一個對象時,還創建一個修改後的副本,並且能夠執行相同的方法以回饋原始並修改。 我創造了這個例子,但它不工作:C++在其自己的類中創建一個對象的修改副本

#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內的錯誤。你能幫我解決這個問題嗎?

編輯 對不起,如果我沒有指定錯誤,但它是一個運行時錯誤,我沒有從編譯器得到任何信息。

+4

你永遠不會初始化'boxTemp'。你應該寫一個構造函數來初始化所有的類字段。 – VTT

+2

當你說「錯誤」時,你的意思是什麼?構建錯誤?運行時崩潰?意外的結果?請花一些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+0

一旦你用'Box'的新實例初始化'boxTemp',確保你不會以遞歸調用結束。 – teivaz

回答

2

轉儲指針如果你沒有任何使用它,並使用本地盒代替。

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(); 
} 
0

如果我理解正確,_instance對於orijinal對象沒有改變(辛格爾頓),還臨時對象(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; 

}