2011-09-29 190 views
0

假設您有一個帶有指向數組的私有指針的類。如何使用getter訪問(或有效地複製數據),以便可以在不同的變量中訪問它。返回指向數組的指針

class MyClass 
{ 
    private: 
     double *x; 
    public: 
     myClass(); 
     virtual ~MyClass(); 
     double* getX() const; 
     void setX(double* input); 
}; 

MyClass::MyClass() 
{ 
    double foo[2]; 
    double * xInput; 
    foo[0] = 1; 
    foo[1] = 2; 

    xInput = foo; 
    setX(xInput); 
} 

void MyClass::setX(double * input) 
{ 
    x = input; 
} 

double * MyClass::getX() const; 
{ 
    return x; 
} 

int main() 
{ 
    MyClass spam(); // Construct object 
    double * bar = spam.getX(); // This doesn't work 
} 

在這種情況下,棒[0]和酒吧[1]等於jibberish:-9.2559631349317831e+061

+0

我很驚訝我在SE上找不到類似的問題,但如果有人證明我錯了,請關閉答案ahoy! – Elpezmuerto

+2

如果您告訴我們您遇到的錯誤,這將有所幫助。 –

+0

很高興提供確切的編譯器輸出,而不是「這不行」。 – unwind

回答

3

只是猜測,程序崩潰或顯示錯誤的輸出。這是因爲構造函數正在設置一個指向局部數組的指針,這會在構造函數結束時離開作用域並被銷燬。

+0

那麼我該如何解決在構造函數中? – Elpezmuerto

+0

@Elpezmuerto:MyClass需要一個'double foo [2]'成員,否則你將不得不使用動態內存。 (對於動態內存,請在C++書籍中閱讀更多內容) –

+0

@Elpezmuerto,您需要使用不會消失的數組初始化指針。它可以是類的成員,靜態變量,傳遞給構造函數的參數,或者用new分配的東西。如果你分配它,但你必須在某個時候刪除它,這需要知道你是否擁有指針,或者它是否通過setX提供。 –

7
MyClass spam(); // Construct object 

這並不構造一個對象,即聲明瞭一個名爲spam函數,它沒有參數,並返回一個MyClass。此默認構造一個對象:

MyClass spam; // Construct object 

欲瞭解更多信息,谷歌最傷腦筋的解析

更新:正如@Mark Ransom所指出的那樣,您的代碼存在另一個問題。在你的構造函數中創建一個數組,然後設置x指向這樣的數組。但是,一旦構造函數完成執行,數組的生命週期結束,所以進一步訪問x會崩潰(如果你夠幸運的話)。

+1

這個傢伙說什麼! :) – MGZero

+1

+1有趣的一點信息! –

+2

而令人煩惱的原因是很難發現 - 我當然錯過了。 +1 –

0

這應該是* bar而不是bar [0]。

+3

在C和C++中,它們是等價的。 –

+0

是的,你是對的,當然是:-) – Dabbler