@Tolstohabr

Почему «идентификатор не определён»?

вот весь код
#include <iostream> 
#include <windows.h> 
using namespace std;
class Triangle
{
public:
	int a;
	int b;
	int c;
	int x;
	int y;
	Triangle(int a1, int b1, int c1) { a = a1; b = b1; c = c1; }
	double S() {
		return (sqrt((a + b + c) * (1.0 / 2) * ((a + b + c) * (1.0 / 2) - c) * ((a + b + c) * (1.0 / 2) - a) * ((a + b + c) * (1.0 / 2) - b)));
	}
	void move()
	{
		cout << endl;
		cout << "введи точку икс : ";
		cin >> x;
		cout << "введи точку игрек : ";
		cin >> y;
		cout << "фигура перемещена в точку " << x << " " << y << endl;
	}
};
class Rectangl
{
public:
	int a2;
	int b2;
	int x2;
	int y2;
	double sinx;
	Rectangl(int a1, int b1, double sinx1) { a2 = a1; b2 = b1; sinx = sinx1; }
	double S1() {
		return (0.5 * a2 * b2 * sinx);
	}
	void move1()
	{
		cout << endl;
		cout << "введи точку икс : ";
		cin >> x2;
		cout << "введи точку игрек : ";
		cin >> y2;
		cout << "фигура перемещена в точку " << x2 << " " << y2 << endl;
	}
};
class Work : public Triangle, public Rectangl
{
public:
	Work(int a, int b, int c, int a2, int b2 , double sinx ) :Triangle(a,b,c), Rectangl(a2,b2,sinx) {};
	void compare()
	{
		cout << S() <<endl;
		cout << S1() <<endl;

		if (S1() > S()) {
			cout << "Площадь четырёхугольника больше \n";
		}
		if (S1() < S()) {
			cout << "Площадь треугольника больше \n";
		}
		if (S1() == S()) {
			cout << "Площадь одинакова";
		}
	}
};
int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	int a, b, c, a2, b2;
	double sinx;
	cout << "создать объекты?(жми 0)" << endl;
	int flak;
	cin >> flak;
	if (flak == 0) {
		cout << "введи стороны треугольника";
		cin >> a;
		cin >> b;
		cin >> c;
		cout << "введи диагонали и синус угла между ними для чутырёхугольника";
		cin >> a2;
		cin >> b2;
		cin >> sinx;

		Work* p;
		Triangle* p1;
		Rectangl* p2;
		p1 = new Triangle(a, b, c);
		p2 = new Rectangl(a2, b2, sinx);
		p = new Work(a, b, c, a2, b2, sinx);
		p->compare();
	}
	cout << "Что хочешь?" << endl;
	cout << "удалить объекты(жми1)" << endl;
	cout << "переместить объекты(жми2)" << endl;
	cout << "сравнить объекты(жми3)" << endl;

	int flak1;
	cin >> flak1;

	if (flak1 == 1) {
		delete p;
		delete p1;
		delete p2;
	}

	system("PAUSE");
	return 0;
}


интересуют три строки в конце с delete

Почему вне if все нормально, а внутри идентификатор не определен
  • Вопрос задан
  • 16163 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
1. Вытащи p, p1, p2 наружу из if. Читай «область видимости».

2. Я бы сделал так…
Work* p = NULL;
if () {
  p = new Work();
}
delete p;

Работает, потому что NULL можно спокойно уничтожать, и ничего не будет.

На Си++11 можно также использовать умные указатели.
std::unique_ptr<Work> p;
if () {
  p = std::make_unique<Work>();  // простите, это Си++14, на 11 чуть не так.
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Потому что p, p1 и p2 -- локальные для блока if (flak == 0), и за его пределами не существуют.
См.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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