2013-03-12 107 views
1

我是C++的新手,我試圖做以下事情:類和數組運算符

我有一個簡單的類,名爲「sim」。我想創建一個類型爲「sim」的10個元素的數組。所以我用sim** a = new sim*[10]

然後我運行一個循環,並創建新的元素,如a[i]=new sim(i)。但是當我後來嘗試打印每個a [i]的值(字段)時,除了我以外,我沒有得到它。

下面是代碼:

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class sim{ 
private: 
    int x; 
    const int y; 
public: 
    sim(); 
    sim(int z); 
    ~sim(); 
    void showInfo(); 
    sim& operator=(const sim& s); 
}; 

sim::sim():y(10),x(0) 
    {} 

sim::sim(int z):y(10),x(z) 
    {} 

sim::~sim() 
    {} 

void sim::showInfo() 
    { 
    cout<<"x="<<x<<", y="<<y<<endl; 
    } 

sim& sim::operator=(const sim& s) 
    { 
    x=s.x; 
    return *this; 
    } 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    sim** a = new sim*[10]; 
    for(int i=0;i<10;i++) 
    { 
     a[i]= new sim(i); 
    } 

    for(int i=0; i<10; i++) 
     (*a)[i].showInfo(); 
    getchar(); 
    return 0; 
} 

這裏是錯誤的輸出:

x=0, y=10 
x=-33686019, y=-830047754 
x=-33686019, y=-572662307 
x=1869774733, y=201385040 
x=725928, y=726248 
x=1423328880, y=11 
x=24, y=2 
x=55, y=-33686019 
x=4814584, y=-1 
x=0, y=0 

Ÿ應該是10總是和x應該是0-9。 我在做什麼錯? 謝謝!

+3

出了什麼問題根本'sim arr [10];'? – jrok 2013-03-12 20:26:20

+0

你有意不使用'std'庫嗎? – 2013-03-12 20:26:27

+0

亞歷克斯:是的。這是作業,我們不允許使用std庫。 jrok:我試過了,沒有運氣。當我做sim arr [10]時,我不能使用sim [i] = new sim(i)。 – bomba6 2013-03-12 20:37:21

回答

2

的問題是在你的發言

(*a)[i].showInfo(); 

這是解引用,給你一個點到SIM實例,那麼你索引到這個操作的順序。相反,你應該索引到,然後解引用的結果:上述

(*(a[i])).showInfo(); 

括號是清晰的緣故。鑑於C++運算符優先級,你可以安全地寫行:

(*a[i]).showInfo(); 

的原因嗎離奇的輸出是你索引斷開你的新分配的第一SIM實例,這是在堆一些任意位置記憶。你只是將後續的內存塊視爲sim實例,這會導致未定義的成員值。

+0

這似乎解決了問題...謝謝! – bomba6 2013-03-12 20:37:43

2
(*a)[i].showInfo(); 

這是不對的。這將產生相同的輸出:

(*((*a) + i)).showInfo(); 

這顯然不是你想要的。

您正試圖訪問a第i個值指向的地址處存儲的對象的showInfo方法。

所以,你應該這樣寫:

(*(a[i])).showInfo(); 

然後你可以添加一些語法糖是,這樣你就沒有那個可怕的引用操作:

a[i]->showInfo(); 
+0

你不應該乘以sizeof(sim *)'。 – 2013-03-12 20:29:33

+0

@metal我認爲這可能會被允許,但我不確定,所以謝謝澄清。 – antonijn 2013-03-12 20:33:00