2015-12-01 40 views
-6

我正在學習C++中的類,所以我嘗試了不同的東西來習慣這些類。在這裏,我想一個指針傳遞給一個類的函數:在C++中傳遞一個類函數的指針

class Pointerss{ 
    int size; 
public: 
    Pointerss(int); 
    void f(); 
    int *a; 
}; 

Pointerss::Pointerss(int siz){ 
    size = siz; 
} 

void Pointerss::f(){ 
    cout<<"Size is:"<<size<<"\n"; 
    for (int i=0; i<size; ++i) { 
     cout<<"a is:"<<a[i]<<"\n"; 
    } 
} 
int main() { 
    int size = 5; 
    Pointerss dd (size); 
    Pointerss * p = new Pointerss(size); 
    p[0]=1; p[1]=2; p[2]=3; p[3]=4; p[4]=5; 
    p->a; 
    dd.f(); 
    return 0; 

} 

因此,「大小」由構造函數,當「f()的」初始化被稱爲正確的數字印刷。但是,當我將「p」分配給「a」(「p-> a」)然後調用「f()」時,會打印一些隨機數。我的電腦打印:

Size is:5 
a is:0 
a is:0 
a is:1 
a is:0 
a is:1606416856 
Program ended with exit code: 0 

「a」和「size」之間有什麼區別,我該怎麼做才能將指針傳遞給函數?

+1

我可以看到至少3個不同的問題。 –

+2

這將被關閉和刪除,但你需要閱讀一個初學者[C++書](http://stackoverflow.com/q/388242/96780),教你什麼「p-> a」(當然,不是任務)以及如何執行變量初始化和賦值。 –

+1

'指針* p =新的指針(大小)'分配一個元素,而不是一個數組。所以'p [1] = 2'是無界限訪問,UB也是如此。 – Jarod42

回答

1

打印隨機數字是因爲Pointerss::f解除引用dd.a您從未初始化過。解引用未初始化的指針會導致未定義的行爲。

這不是你唯一的錯誤。您還爲單個Pointerss對象分配內存,該對象由p指向,但是繼續構建指向未分配內存的p[1..4]中的對象。這也會導致未定義的行爲。

第三,你永遠不會釋放你用new分配的內存。

1

第1步將瞭解指針。當您製作int*時,您只能保留內存來存儲指針本身。您不會爲任何int預留內存。所以當你試圖打印整數時,你只會得到隨機數(或者可能是程序崩潰)。

所以你的班級不能持有任何整數。您需要對其進行更改,以便在構造函數中保留內存,並在析構函數中釋放它。

class Pointerss{ 
    int size; 
public: 
    Pointerss(int); 
    ~Pointerss(); 
    void f(); 
    int *a; 
}; 

Pointerss::Pointerss(int siz){ 
    size = siz; 
    a = new int[size]; // Reserve memory for size integers 

    // Do some initialization if needed, e.g. 
    for (int i=0; i < size; i++) a[i] = i; 
} 

Pointerss::~Pointerss(){ 
    delete[] a;   // Release the memory again 
} 

void Pointerss::f(){ 
    cout<<"Size is:"<<size<<"\n"; 
    for (int i=0; i<size; ++i) { 
     cout<<"a is:"<<a[i]<<"\n"; 
    } 
} 

而且你不能讓一個指針類的實例,即

Pointerss * p = new Pointerss(size); 

,然後使用它像

p[0]=1; p[1]=2; p[2]=3; p[3]=4; p[4]=5; 

,因爲這是在5個不同的操作實例。

最後的代碼:

p->a; 

什麼也不做!

你可以做

p->a[0] = 5; 

但目前還不清楚是什麼你正在嘗試做的。

請注意,dd和p指的是您的課程的兩個不同實例,因此更改*p中的內容並不會改變dd。

如果你做了:

Pointerss *p = &dd; 

然後*p和DD是相同的實例。

相關問題