@Kryptonit

Почему выводится статичное некорректное значение?

Возникла проблема, у меня есть класс Figure и 2 его наследника при заполнении вектора элементами-объектами этих классов вместо корректно переданных координат выводится что-то непонятное, это не совсем мусор, подскажите в чём может быть проблема (Coutы поставил, там где нужно)

#include <iostream>
#include <ctime>
#include <vector>


using namespace std;

const int rectArraySize = 4;
const int circArraySize = 3;
const int countOfFigure = 17;
const int R = 10;




class Figure {
public:
	double* geometry;
	double* speedyPointer;
	Figure() {

	};
	virtual void move() {

	};
	virtual void rotate() {

	};
	//virtual ~figure() {
		//cout << "DELETION";
	//}; 
};

class Circle : public Figure {
public:

	Circle(double centerCoordX, double centerCoordY, double radius) {
		double circleMainArray[circArraySize] = { centerCoordX, centerCoordY, radius };
		geometry = circleMainArray;
		//cout << geometry[0] << '\n';
	}
};

class Rectangle : public Figure {
public:
	Rectangle() {
		geometry = new double[rectArraySize];
		geometry[0] = 0;
		geometry[1] = 0;
		geometry[2] = 0;
		geometry[3] = 0;
	}
	Rectangle(double centerCoordX, double centerCoordY, double height, double width) {
		double rectangleMainArray[rectArraySize] = { centerCoordX, centerCoordY, height, width };
		geometry = rectangleMainArray;
	}
};





int main() {
	int squareSide = 100 * R;
	srand(time(0));
	//Circle* circleArray = new Circle[countOfFigure];
	vector <Circle> circleArray;
	vector <Rectangle> rectangleArray;


	for (int i = 0; i < countOfFigure; i++) {
		int currentFigure = rand() % 2 + 1;
		switch (currentFigure) {
		case 1:
		{
			int centerCoordX = R + rand() % (100 - R);
			int centerCoordY = R + rand() % (100 - R);
			//cout << centerCoordX << " " << centerCoordY <<" "<< R<< '\n';
			Circle Cir(centerCoordX, centerCoordY, R);
			cout << Cir.geometry[0] << endl;
			circleArray.push_back(Cir);
		}
		case 2:
		{
			int height = R;
			int width = R;
			int centerCoordX = rand() % (100 - R / 2) + R / 2;
			int centerCoordY = rand() % (100 - R / 2) + R / 2;
			Rectangle rect(centerCoordX, centerCoordY, height, width);
			rectangleArray.push_back(rect);
		}
		}



	}
	cout << circleArray[0].geometry[0] << " " << circleArray[0].geometry[1] << "  " << circleArray[0].geometry[2] << typeid(circleArray[1]).name();
	cout << rectangleArray[1].geometry[0] << " " << circleArray[1].geometry[1] << "  " << circleArray[1].geometry[2] << typeid(rectangleArray[1]).name();

	return 0;
}
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
double circleMainArray[circArraySize] = { centerCoordX, centerCoordY, radius };
geometry = circleMainArray;


Тут вы заводите локальную переменную circleMainArray, а потом копируете ее адрес в член geometry. По выходу из конструктора локальная переменная удаляется. На ее месте потом поялвяется что-то другое (она на стеке, так что там могут быть адреса возврата, значения регистров или других локальных переменных).

Правильно было бы выделять память в куче под geometry и или заполнять его руками, или копировать туда данные из локальной перменной. А еще лучше - использовать std::vector.
geometry = new double[circArraySize];
geometry[0] = ...;
geometry[1] = ...;

Или лучше
std::vector<double> geometry;
...
Circle(double centerCoordX, double centerCoordY, double radius) :
   geometry{centerCoordX, centerCoordY, radius} {}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы