2012-04-17 69 views
1

我是C++的新手,正在嘗試使用動態內存來創建一些基本對象。 我傳遞一個int參數給一個方法,它正在改變全局變量的值。我認爲這與我爲新對象分配內存的方式有關,我無法用其他方式編譯它。Seg Fault - 將變量傳遞給方法更改全局值

int main() { 
    int inp; 
    CRectangle rectb (2,2); 
    cout << "enter number of items to add" << endl; 
    cin >> inp; // let's say inp = 7 
    rectb.addItemsArray(inp); 
    cout << "inp after adding items: " << inp << endl; // inp is now 1. 
} 

頭文件:

class CRectangle { 
    int width; 
    int height; 
    item *items[]; // SOLUTION: change this line to "item *items" 
    int input; 

public: 
     CRectangle (int,int); 
     int addItemsArray(int); 
     int area() { return (width*height); } 
     int get_items(int); 

}; 

- 和 -

class item { 
    int foo; 
    char bar; 
public: 
    //SOLUTION add "item();" here (a default constructor declaration without arguments) 
    item (int, char); 
    int get_foo(); 
    char get_bar(); 
}; 

方法:

int CRectangle::addItemsArray(int in) { 
    cout << "value of in at begginning:" << in << endl; //in = 7 
    int i; 
    i = 0; 
    //SOLUTION: add "items = new item[in];" on this line. 
    while (i < in) { 
     items[i] = new item(1, 'z'); //SOLUTION: change this line to "items[i] = item(1, 'z');" 
     i++; 
    } 
    cout << "value of in at end " << in << endl; //in = 7 
    return 1; 
} 

有時我得到一個總線錯誤或賽格故障。有時它可以像預期的那樣使用較低的數字,如2或3,但並不總是如此。

任何幫助將不勝感激。

編輯(CRectangle的構造函數):

CRectangle::CRectangle (int a, int b) { 
    width = a; 
    height = b; 
} 

(項目的構造函數):

/* SOLUTION add default item constuctor 
item::item() { 
    foo = 0; 
    bar = 'a'; 
} 
*/ 

item::item(int arg, char arg2) { 
    foo = arg; 
    bar = arg2; 
} 
+0

難道您發佈CRectangle的構造函數的實現? – Erwald 2012-04-17 13:48:53

+0

是的,我們需要看看它是如何初始化「items」的。 (爲什麼不使用類似'vector'的東西來爲你做所有這些事情?) – 2012-04-17 13:49:22

+0

沒有這個類的其他代碼,很難知道什麼是錯的。不過,我的第一個猜測會與你的物品數組有關。你是否曾經(重新)分配空間來記錄指向新項目的指針? – atk 2012-04-17 13:50:13

回答

1

看起來你忘了創建項目陣列...

您定義了一個動態分配數組(不是item * items [100],而是item * items [])。之前,你可以使用數組,你必須分配內存來存放物品:

items = new item[100]; 

不要忘記在結束與

delete [] items; 

將其刪除。 ;)

代替

int i; 
i = 0; 
while (i < in) { 
    items[i] = new item(1, 'z'); 
    i++; 
} 

而且我會用

for (int i=0; i<in; i++) 
{ 
    items[i] = new item(1, 'z'); 
} 
+0

我加了「items = new item [100];」到CRectangle構造函數,但它不會以這種方式編譯。將「item * items [100]」添加到items聲明中,我試圖在運行時分配內存。我是否總是必須爲陣列分配一個高估(100)? – user1034772 2012-04-17 14:18:40

+0

/***我已將我的解決方案編輯到OP中。 *** /它基本上是您的解決方案的修改版本,DirkMausF。 TX。 – user1034772 2012-04-17 15:23:25

4

的問題是,你有沒有爲您分配投入items指針任何存儲。我建議改變:

item *items[]; 

std::vector<item*> items; 

,然後將項目添加到它:

items.push_back(new item(1, 'z')); 
+0

或者,爲了簡單起見,可以使用'std :: vector items'和'items。push_back(item(1,'z'));'。 – 2012-04-17 14:00:51

+0

感謝您的帖子。我避免使用向量,因爲我試圖在開始使用有用的工具(如字符串和向量)之前學習如何在本地更多地使用(不使用其他類)。 – user1034772 2012-04-17 14:05:39