Brij2010 Ответов: 6

Синтаксическая ошибка объявления


Q1)разработайте класс student, содержащий getdata() и displaydata()в качестве двух его методов, которые будут использоваться для чтения и отображения информации о студенте соответственно getdata() будет частным методом?


Является ли мой код правильным в соответствии с вопросом?
(Я не могу решить синтаксическую ошибку объявления в части void main() )


КОД:-
#include<iostream.h>
class student
{
int rollno;
char name;
char stream;
   void getdata(int R,char N,char S)
        {
        rollno=r;
        name=N;
        stream=S;
        }
public:
   void displaydata()
        {
        cout<<"Information \n";
        } 
};
   void main()
        {
        student s1
           {
           cout<<"Student s1:";
           }
        s1.getdata(112,Rahul,Science);
        s1.displaydata();
         
        student s2
           {
           cout<<"Student s2: ";
           }   
        s2.getdata(113,sam,Arts);
        s2.displaydata();
        }



[edit]добавлены блоки кода, убраны отступы, удалены крики - OriginalGriff[/edit]

6 Ответов

Рейтинг:
48

Stefan_Lang

1. вы используете STL классы, в данном случае cout, но не определил, чтобы use это пространство имен. Все классы STL находятся в пространстве имен 'std- и таким образом должен быть использован либо с ... std::- префикс, или вы должны добавить строку

using std;

где-то перед вашим кодом.

2. тип char вы использовали для переменных 'name' и 'stream- это всего лишь один символ, а не строка, как вы, кажется, намеревались. В языке Си вы можете использовать массив символов или выделить такой массив из памяти во время выполнения и указать на него с помощью переменной указатель-символ для хранения адреса. Поскольку вы уже используете STL, я предлагаю использовать string класс оттуда же, std::string.

3. это всего лишь предположение, но имя переменной 'stream'невероятно близок к некоторым символам, которые уже определены в std:: (например. istream, ostream, fstream). Если вы хотите убедиться, что не получаете столкновений имен между символами, используемыми внутри std, то, вероятно, лучше не прибегать ко второму варианту, предложенному в 1., выше. Вместо префикса все символы из std с 'std::- ...Это действительно включает в себя ... cout- который вы использовали в main().

4. первые объявления в вашем классе, student все они определены как частные. То есть по умолчанию в class. getdata() поэтому он также является частным, что, вероятно, не имеет большого смысла - вам нужно объявить его общедоступным, чтобы сделать его доступным из main().

5. Параметры, передаваемые getdata доступны только для чтения! Термин "получить", кажется, указывает на то, что вы хотите читать свойства из вашего объекта student в переменные, передаваемые этой функции, но, если это ваше намерение, то вам нужно передать переменные по ссылке, нет по значению Например, вот так:
void getdata(int& R, std::string& N, std::string& S)

Тем не менее, то, как вы называете getdata() от главного, кажется, указывает на то, что вы хотите использовать его для *набор* свойства студента, а не *получить* данные, хранящиеся внутри!?
Вопрос в том, является ли ваш задача чтобы определить *набор* метод, а не а *получить* метод, в этом случае ваш метод был просто неправильно назван, но подпись была технически правильной (кроме строковых типов). Обратите внимание, однако, что хотя это нормально передавать переменную встроенного типа, такого как int (или char) по значению, вместо этого вы должны передавать составные типы по ссылке const:
void setdata(int R, const std::string& N, const string& S)


6. Как уже отмечалось, задания в getdata() перевернуты (но они верны, если вы действительно пытались написать *набор* функция)

7. в displaydata(), не используйте '\n- в цепочке, к которой ты переходишь. cout. Эффект управляющих символов может зависеть от операционной системы! Вы можете вывести символ std::endl вместо этого, вот так:
std::cout << "Information" << std::endl;

Да, '\n будет отлично работать на большинстве ОС, и std::endl это дольше писать. Но с другой стороны, это не так уж много дополнительных усилий для того, чтобы сделать программу переносимой на любую ОС, даже ту, которая еще не существует.

8. функция main() может иметь только одну из двух подписей:
int main()

или
int main(char argc, char *argv[])

Любая другая сигнатура является ошибкой, хотя многие компиляторы принимают ее без предупреждения. Не все, однако! Так что, по крайней мере, сделайте возвращаемый тип int.

9. Как указано выше, вы, видимо, пытаясь использовать свой *получить* функция к *набор* значения вашего объекта student. Было ли это вашим намерением, и соответствовало ли это поставленной перед вами задаче, или нет? Если используется для получения данных, то, очевидно, вы не можете передавать прямые значения, вместо этого вы должны использовать переменные, которые вы определяете внутри main(), который затем будет содержать данные, возвращаемые getdata() В противном случае, передавая целочисленную константу, такую как 112 это нормально, но чтобы определить строковые константы, вам нужно заключить текст строки в двойные кавычки, например так:
s1.setdata(112, "Raoul", "Science");


10. Ваша функция displaydata() не печатает никаких данных student информация по мере необходимости, только постоянная строка. Вы также должны вывести переменные-члены student.

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

Если все остальное не удается, помните, что компьютер-это очень, очень тупой "человек", хотя и довольно быстрый. Оно будет буквально делайте то, что вы говорите, и, возможно, не получите никаких последствий, которые вы принимаете как должное, когда разговариваете с реальным человеком.


Рейтинг:
1

YvesDaoust

Несколько аномалий:

- #include оператор без целевого файла. Что вы хотели включить ?

- метод getdata не должен быть приватным (как по умолчанию), иначе вы не сможете вызвать его в main.

- объявления s1 и s2 должны заканчиваться точкой с запятой (;).

- объявления s1 и s2 в основной функции сопровождаются блоком операторов: это выглядит так, как будто вы намеревались объявить метод, но это не то место. Или вы вставили бесполезные скобки. Проясните это.

- поток должен быть символьной строкой, а не одиночными символами, я думаю.

- Рахул, наука, Сэм и искусство должны передаваться как строки, а не как переменные (кавычки отсутствуют).


Sergey Alexandrovich Kryukov

Мой 5, я добавил еще немного к нему, пожалуйста, смотрите (не то, чтобы это имело большой смысл :<).
--СА

YvesDaoust

Я согласен :)

Рейтинг:
1

Stefan_Lang

Разработайте класс student, содержащий getdata() и displaydata()в качестве двух его методов, которые будут использоваться для чтения и отображения информации о студенте соответственно getdata() будет частным методом?

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

Интерпунктуация спасает жизни:
Давай съедим дедушку!
Давай поедим, дедушка!

;)


Рейтинг:
1

Sergey Alexandrovich Kryukov

Чтобы добавить больше аномалий к решению от YvesDaoust:

Не используйте никаких операций ввода-вывода (cout<<"Information \n";) в классе student.

Метод getdata должно быть скорее называется setdata Точнее, он не должен существовать, так как должен стать конструктором.

Идентификаторы C++ чувствительны к регистру, вы не соблюдаете регистр, поэтому код не будет компилироваться. Сравнивать rollno=r и R Не используйте однобуквенные имена для любых идентификаторов. Все идентификаторы должны быть семантическими.

Как правило, класс почти ничего не делает, не имеет большого смысла.

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

—СА


Stefan_Lang

Мой 5 - если ничего другого, чтобы противостоять несокрушимому нисходящему голосу.
P.S.: Я действительно не согласен с вашим советом пойти в другое место, я не вижу причин, почему новичок не должен задавать вопросы здесь. По крайней мере, он потратил усилия, чтобы написать какой-то код, а не просто попросить его.

Sergey Alexandrovich Kryukov

Спасибо, Стефан.

Я просто думаю, что такие вопросы не эффективны. Допустим, нет причин не спрашивать об этом, но сколько пользы? Я не могу себе представить, как можно чему - то научиться только из ответов. Как вы думаете, может ли OP улучшиться без чтения руководства по C++? Я так не думаю. Есть вещи, которым нужно научиться в первую очередь, несмотря ни на что.
--СА

Рейтинг:
0

OriginalGriff

Я бы предложил добавить точку с запятой в конце этих строк:

student s1


student s2



В следующий раз попробуйте дать нам строки, на которые жалуются, и сообщение об ошибке, которое вы получите!


Sergey Alexandrovich Kryukov

Мои 5, гораздо больше проблем, видят два других ответа; я не думаю, что все это имеет большой смысл. :&низкотемпературный;
--СА

Рейтинг:
0

Member 14019680

в функции getData defination u получит 112 и 113 в int R
и вместо того, чтобы присваивать R rollno u, вы присваиваете неопределенный символ(r) roll no.


CHill60

Уже упоминалось в решении 3

jeron1

ЛОЛ, да, 7+ лет назад!

CHill60

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