2011-03-03 70 views
1

嘿,我幾年前教了自己的PHP,現在在大學裏,並且對Java比較熟練(因此我的意思是我是初學者,但是我的數據結構當然在這我將採取算法下學期)幫助第一個C++類/指針

在任何情況下......我想學C++和偶然發現了這一點: http://newdata.box.sk/bx/c/

什麼是真的絆倒了我,現在是一個指針。 ..我想我得到的理論,但一個非常簡單的「程序」是不正確的。它編譯,但然後有一個內存錯誤。

我已經決定購買C++ Primer,在這裏進行一些搜索,因此它會在週五到達這裏。在此之前,任何人都可以告訴我什麼是(可怕的)錯這個簡單的代碼:

class Number { 
public: 
    string *owner; 

    int getNum() { 
     return *num; 
    } 

    int getTwice() { 
     return *twice; 
    } 

    Number(int our_num, string me) { 
     *num = our_num; 
     *twice = 2 * *num; 
     *owner = me; 
    } 

private: 
    int *num; 
    int *twice; 

}; 

int main() 
{ 
Number *nbr3 = new Number(3,"Bob"); 

cout << nbr3->getNum() << endl; 
cout << nbr3->getTwice() << endl; 
cout << nbr3->owner << endl; 
delete nbr3; 
system("PAUSE"); 
return 0; 
} 

的錯誤出現在構造函數...像* NUM = our_num一部分。

但是,不是說「將num指針的值設置爲our_num」?這就是我想要的!

感謝您與我所知道的幫助是一個非常愚蠢的和根本性的錯誤...

+0

沒有**算哪裏,你試圖做「2 * NUM」,還必須「民」和「兩次」爲指針,以一些記憶,但你不被方式,爲他們分配內存 – fazo 2011-03-03 04:51:37

+0

哦...我認爲代碼試圖做的事情相當明顯,但以防萬一:我有一個「Number」類,每個Number都有一個值和一個所有者,當創建一個新實例時,它們都被傳入。然後還有「兩倍」值,它被設置爲數值的兩倍。 – 2011-03-03 04:52:19

+1

我要加你如何需要得到一個C++的書,從無數次學習評論,直到你提到你已經購買了C++入門。第一次在Stack Overflow上搜索你的榮譽。 – 2011-03-03 04:54:38

回答

1

您沒有分配內存位置以指向num, twice,owner。所以,在你的構造 -

Number(int our_num, string me) { 

    num = new int; 
    twice = new int; 
    owner = new string; 

    *num = our_num; 
    *twice = 2 * (*num); 
    *owner = me; 
} 

,因爲類是管理資源,class Number應遵循 - Rule of Three

編輯1

指針是像任何其他變量,但擁有一個內存地址。只是聲明int* ptr;並不意味着ptr正在將a指向有效的內存位置。您應該將其分配/初始化爲它應該指向的位置。

所以,

int *ptr; 
int num = 10; 
ptr = &num; // ptr points to num location 

int *ptr2 = new int; // The operator returns a memory location from free store that can hold an integer. 
*ptr2 = 10; // Now, store 10 in the location ptr2 is pointing to. 
// ...... 

delete ptr2; // You should return the resources back to the free store since we are managing resources. 

希望它可以幫助到的程度。

+0

它應該是'owner = new string';' – fazo 2011-03-03 04:55:10

+0

@fazo - 謝謝指出。糾正。 – Mahesh 2011-03-03 04:56:43

+0

謝謝!我認爲內存是在我聲明變量時分配的。 – 2011-03-03 04:59:33

0

Num和兩次不指向任何東西。在類的構造函數中,您需要num = new int和兩次= new int,並且在析構函數中需要將其刪除

1

這就是問題所在:

Number(int our_num, string me) { 
    *num = our_num; 
    *twice = 2 * *num; 
    *owner = me; 
} 

private: 
    int *num; 
    int *twice; 

在你的類,你已經宣佈NUM和兩次是三分球,但他們不點 任何東西。做* num = our_num不會改變指針,而是這意味着你正在取消指定num指向的內容,以便分配our_num中包含的值。這將導致崩潰,因爲num是一些隨機值。

爲了解決這個問題,先設置指針指向一個int。

e。摹

int myints[2]; 

num = myints 
twice = myints+1; 

那麼你可以做

*num = our_num 

所以,當你寫

int *num;你是在告訴NUM將包含地址的編譯器。

當您使用

num你實際上處理的地址。

當你寫 *num

你會引用是在地址num的數據。