2012-04-17 4 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, но не всегда.

Любая помощь была бы принята с благодарностью.

Edit (конструктор 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

+0

Да, нам нужно посмотреть, как он инициализирует 'items'. (И почему вы не используете что-то вроде «вектора», которое делает все это для вас?) –

+0

Без остальной части кода для класса трудно понять, что не так. Однако мое первое предположение было бы связано с вашим массивом элементов. Вы когда-либо (повторно) выделяли пространство для записи указателей на новые предметы? – atk

ответ

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]» к объявлению элементов работает, я пытаюсь выделить память во время выполнения. Всегда ли мне приходится выделять переоценку (100) для массива? – user1034772

+0

/*** Я редактировал свое решение в OP. ***/Это в основном модифицированная версия вашего решения DirkMausF. Tx. – user1034772

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')); '. –

+0

Спасибо за сообщение. Я избегал использования вектора, потому что я пытаюсь научиться делать что-то более естественным образом (без использования других классов), прежде чем начинать использовать полезные инструменты, такие как строка и вектор. – user1034772