Member 13604021 Ответов: 1

Здравствуйте, этот код дает ошибку на компиляторе, и я не мог найти проблему , что такое t


#include <iostream>
использование пространства имен std;
тап_п()
{
int k,a=3,b=4;
тест*p=новый тест(3,2);
p->показать();
p->get(a,b);
соиь<&ЛТ;а&ЛТ;&ЛТ;" "&ЛТ;&ЛТ;б&ЛТ;<епси;
p->set(4);
удалить p;
p=новый тест [3];
p[1].get(a,b);
p[1].показать();
соиь<&ЛТ;а&ЛТ;&ЛТ;" "&ЛТ;&ЛТ;б&ЛТ;<епси;
b-=7;
p[2].get(a,b);
p[2].показать();
соиь<&ЛТ;а&ЛТ;&ЛТ;" "&ЛТ;&ЛТ;б&ЛТ;<епси;
p[0].показать();
удалить []p;
система ("пауза");
}

классный тест{
int x,y;
общественный:
тест(int m=2,int n=3)
{
x=m;
y=n;
}
void set (int t)
{
x=t;
y=t+t;
}
пустота вам (инт &амп; м инт &усилителя; Н)
{
x=m;
y=n*2;
m=x+1;
n=y-2;
}
недействительным ()
{
соиь< в<х&ЛТ;&ЛТ;" "&ЛТ;&ЛТ;г&ЛТ;<епси;
}
~тест()
{
соиь<&ЛТ;х*й&ЛТ;<епси;
}

удалить []p;
система ("пауза");
}
классный тест{
int x,y;
общественный:
тест(int m=2,int n=3)
{
x=m;
y=n;
}

void set (int t)
{
x=t;
y=t+t;
}
пустота вам (инт &амп; м инт &усилителя; Н)
{
x=m;
y=n*2;
m=x+1;
n=y-2;
}
недействительным ()
{
соиь< в<х&ЛТ;&ЛТ;" "&ЛТ;&ЛТ;г&ЛТ;<епси;
}

~тест()
{
соиь<&ЛТ;х*й&ЛТ;<епси;
}
};

Что я уже пробовал:

Я пробовал в блоке кода и в microsoft visual оба компилятора дают ошибку ?
я загружаю изображение ошибок по ссылке вниз
https://ibb.co/ieRDMb

CodeWraith

Тогда, возможно, не стоит заставлять нас гадать. Какую ошибку показали компиляторы? И обычно как CodeBlocks, так и VS говорят вам, в каком коде ine у них есть проблема.

Я бы предложил посмотреть на сообщения об ошибках, посмотреть значение ошибки, а затем внимательно посмотреть на строку кода. Если это не поможет, вернитесь и опубликуйте сообщение об ошибке и не забудьте упомянуть, какая строка кода здесь.

Member 13604021

список ошибок находится здесь,я не смог загрузить изображение, так что это ссылка на изображение ttps://ibb.co/ieRDMb, спасибо .

CodeWraith

Эти ошибки не соответствуют обновленному коду, который вы опубликовали, по крайней мере, насколько я могу видеть. Итак, мы вернулись к началу. Теперь мы можем играть в эту игру бесконечно, или вы можете попытаться прочитать сообщения об ошибках и попытаться решить их один за другим. Что, например, так трудно понять о чем-то вроде "теста", не объявленного в этой области? Вам действительно нужно, чтобы мы сказали вам, что вы должны объявить переменные (с правильным типом!), прежде чем использовать их?

Это все очень простые ошибки. Я знаю, что это может быть неприятно в начале, но вы не продвинетесь очень далеко, если не научитесь читать сообщения об ошибках. посмотрите на код и исправьте его.

Начните с самой верхней ошибки. Прочтите сообщение об ошибке, посмотрите его или спросите нас, если вы все еще не понимаете, что это значит. А потом ты все исправишь. Перекомпилируйте и повторяйте эту процедуру до тех пор, пока у вас не будет больше ошибок или предупреждений.

Member 13604021

Дело в том, что я не понимаю, что "тест" - это не переменная, это имя класса, и оно не должно быть объявлено в основном, насколько я знаю,
когда мы работаем с классами, достаточно написать имя класса , а затем создать объект для этого класса, и "*p" - это имя объекта, в котором динамический массив "новый тест" присваивается указателю, если я не неправильно понял код, и я действительно не понимаю, где именно ошибка, потому что код из книги, и мне нужно проследить его, Спасибо за ответ !

CodeWraith

"тест" - это название класса, это верно. Объявление класса всегда вводит новый самоопределяющийся сложный тип данных. Чтобы получить экземпляр класса (в любом месте, где он вам нужен, а не только в main (), вы должны сначала объявить пуант вашему типу класса и присвоить ему значение с помощью оператора 'new'. Давайте поместим эти две вещи в две отдельные строки, чтобы сделать это более ясным:

test* p; // это просто обычное объявление переменной
// указатель на объект типа 'test'

p = новый тест(1, 2); // здесь мы фактически даем p значение.
// для нового объекта выделяется память
// и параметры 1 и 2 передаются в
// конструктор

Теперь вы можете использовать p для доступа к новому объекту и вызова методов и делать с ним все, что захотите. Но есть еще одна важная вещь, которую вы должны сделать, когда вам это больше не нужно:

delete p; // это освобождает память, которая была использована объектом

Если вы не очистите свою программу, у нее будут огромные утечки памяти. В функции main() это может и не быть проблемой, но все равно будет небрежно. В других функциях или методах это нечто меньшее, чем ошибка.

CodeWraith

Теперь я увидел это:

p=новый тест [3];

Это не работает, потому что тип Р неправильный. Это должно работать лучше:

test** p; // это указатель на указатель 'test'!
p= новый тест*[4];

Это должно дать вам массив с четырьмя указателями на объекты типа "тест". Внимание: эти четыре указателя еще не были инициализированы!

Что-то вроде этого маленького цикла (и не забудьте очистить его позже, удалив четыре объекта в аналогичном цикле):

int i;
для(i = 0; i < 4; i++)
{
p[i] = новый тест(i, i + 1);
}

Member 13604021

Я все понял, большое вам спасибо !

PIEBALDconsult

Вы имеете в виду вот эту ошибку?
IntelliSense: значение типа "test *" не может быть присвоено сущности типа "int *"

1 Ответов

Рейтинг:
1

CodeWraith

Просто смотрю на ваши первые несколько строк:

int *p;          // here you declare p as 
                 //a pointer to an int
p=new test (3,2) // and here you assign an 
                 //instance of test to it
                 // Also: You forgot something
                 // at the end of te line! (;)