Я новичок в 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;
}
Не могли бы вы опубликовать реализацию вашего CRectangle конструктора? – Erwald
Да, нам нужно посмотреть, как он инициализирует 'items'. (И почему вы не используете что-то вроде «вектора», которое делает все это для вас?) –
Без остальной части кода для класса трудно понять, что не так. Однако мое первое предположение было бы связано с вашим массивом элементов. Вы когда-либо (повторно) выделяли пространство для записи указателей на новые предметы? – atk