Я студент университета и пытаюсь решить задание на С++, данное мне профессором. Прошу прощения за мой английский. Короче говоря, мне нужно управлять определенным количеством объектов (одного типа) без использования массивов, а только с помощью указателей. Речь идет об объектах типа «Дом».
Я создаю указатель на «Дом» и с помощью цикла указываю указатель на новый объект типа «Дом», инициализированный переменными, введенными пользователем. Затем я двигаю указатель и начинаю снова.
House* housePtr;
cout<<"We start building houses, you will have to build 4.\n";
for (auto i=0; i<4; ++i, ++housePtr)
{
int r, d;
cout<<"\nLet's build the number "<<i+1<<endl;
cout<<"How many rooms must it have?\n";
cin>>r;
cout<<"\nHow far is it from the center?\n";
cin>>d;
housePtr= new House(r, d);
}
Проблема возникает, когда я прокручиваю объекты, на которые указывает указатель. Например, чтобы распечатать значения, которыми обладают созданные мной объекты.
Предыдущий цикл for оставляет мне указатель на позицию рядом с последним созданным объектом. Итак, с помощью цикла for я возвращаю указатель к первому объекту (таким образом, я возвращаю его на 4 шага назад) и на каждой итерации заставляю его печатать адрес памяти, удерживаемый указателем, то есть адрес памяти каждого Дома.
for (auto i=0; i<4; i++, housePtr--)
{
cout<<endl<<housePtr<<endl;
}
И это вывод этого последнего фрагмента кода:
0x10139c
0x101390
0x101384
0x101378
Первый — это адрес, который не имеет ничего общего с объектами, потому что он присущ положению, следующему за последним объектом. Остальные 3 следующих являются (согласно моей логике) адресами четвертого, третьего и второго домов соответственно.
Снова взяв указатель, для каждого объекта я напечатал его значения, а также адрес
for (auto i=0; i<4; housePtr++, i++)
{
cout<<"\nThe house "<<i+1<<" has "<<housePtr->getNumOfRooms()<<" rooms and is ";
cout<<housePtr->getDistanceFromCenter()<<" meters from the center\n";
cout<<housePtr<<endl;
}
И это вывод:
The house 1 has 190607135 rooms and is 201338508 meters from the center
0x10136c
The house 2 has 7 rooms and is 4 meters from the center
0x101378
The house 3 has 190607135 rooms and is 201338508 meters from the center
0x101384
The house 4 has 5 rooms and is 8 meters from the center
0x101390
Первоначальные входные данные, которые я ввел, следующие:
We start building houses, you will have to build 4.
Let's build the number 1
How many rooms must it have?
8
How far is it from the center?
7
Let's build the number 2
How many rooms must it have?
5
How far is it from the center?
8
Let's build the number 3
How many rooms must it have?
7
How far is it from the center?
4
Let's build the number 4
How many rooms must it have?
5
How far is it from the center?
8
Я не могу понять, почему он не печатает данные правильно и по какой причине на одной итерации печатает данные объекта, а на следующей печатает случайные числа.
В чем проблема?
new[]
. Вы можете выполнить итерацию, взявHouse* = &houses[0];
, а затем увеличить его, но вы должны инициализировать в массиве. - person JohnFilleau   schedule 02.04.2020House
в своемhousePtr
, пропуская (без возможности их возврата) все остальные. - person Algirdas Preidžius   schedule 02.04.2020