2014-11-10 3 views
-2

У меня вопрос о работе с классами в C++. Я должен сказать, что я новичок. Например, у меня есть этот класс:Отображение результатов в C++

class student { 
    private: 
     char* name; 
    public: 
     int nrcrt; 
     student() { 
      name = new char[7]; 
      name = "Anonim"; 
      nrcrt = 0; 
     } 
     student(char* n, int n) { 
      this->name = new char[7]; 
      strcpy(name, n); 
      nrcrt = nr; 
     } 
     ~student() { 
      delete [] name; 
     } 
     char* get_name() { 
      return this->name; 
     } 
} 

void main() { 
    student group[3]; 
    group[0] = student("Ana", 1); 
    group[1] = student("Alex", 2); 
    group[2] = student("Liam", 5); 

    for (i=0; i<3; i++) { 
     if (group.nrcrt[i] != 0) 
      cout << group[i].get_name() << Endl; 
    } 
} 

Мой вопрос: почему он отображает разные символы?

+0

Код не компилируется. –

+1

Добро пожаловать в SO. Мы не сайт, который отлаживает ваш код вместо вас. Чего вы пытаетесь достичь, и в чем проблема, которую вы хотели достичь? Покажите нам свои усилия, и, скорее всего, мы вам поможем. –

+0

@AntonSavin возможно 'group [i] .nrcrt' , а не 'group.nrcrt [i]' –

ответ

0

Прежде всего, ваш код не работает.

3.cpp:40:18: error: request for member ‘nrcrt’ in ‘group’, which is of non-class type  ‘student [3]’ 
    if(group.nrcrt[i]!=0) 

i также не объявлен.пожалуйста, внесите соответствующие изменения.

group.nrcrt[i] 

должен быть изменен на:

group[i].nrcrt 
0

не волнуйтесь. C++ может выглядеть немного страшно, как сначала, но это нормально, когда вы входите в него. Во-первых, допустим, что все классы хорошо начать с букв верхнего регистра. Во-вторых, у вас есть два конструктора (по умолчанию без параметров и один или несколько, в нашем случае один). По умолчанию consructor вам нужно объявить массив объектов:

Student group[3]; 

Следующим важным является то, что вы тогда не нужны остальные конструкторы в этом случае.

group[0]=student("Ana",1); 
group[1]=student("Alex",2); 
group[2]=student("Liam",5); 

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

class Student 
{ 
    private: 
     char* name; 
public: 
    int nrcrt; 
Student() 
{ 
    name=new char[7]; 
    strcpy(name, "Anonim"); 
    nrcrt=0; 
} 
Student(char* n, int n) 
{ 
    this->name=new char[7]; 
    strcpy(name, n); 
    nrcrt=nr; 
} 
~Student() 
{ 
    delete [] name; 
} 

char* get_name() 
{ 
    return this->name; 
} 

}; 
int main() 
{ 
    Student group[3]; 

for(int i=0;i<3;i++) 
{ 
    if(group.nrcrt[i]!=0) 
     cout<<group[i].get_name()<<endl; 
} 
    return 0; 
} 
+1

Дело в том, что когда я хочу отображать указатель на символ, на экране появляется нечто вроде «îăîăîăîîă». Что касается программы, написанной с ошибками, это был скорее пример, который я написал в спешке, чтобы объяснить проблему. Прости. – Mada

+0

Да, потому что вы назначаете в конструкторе по умолчанию: name = "Anton" ... Нет, как только вы используете новый оператор, вы должны скопировать данные с помощью strcpy. – celeborn

+0

«Во-первых, предположим, что все классы должны начинаться с букв верхнего регистра« Mhh ... ** no, это не правило C++ **. Если вы оставите это предложение, я могу поставить вас -1 в течение дня. Изменить плз. –

0

Когда массив создан, используется конструктор по умолчанию.
Когда вы назначаете элементы, вы вызываете деструктор, удаляя name.
Конструктор по умолчанию назначает литерал name, а удаление этой памяти имеет неопределенное поведение.

В конструкторе по умолчанию, замените

name = "Anonim"; 

с

strcpy(name, "Anonim"); 

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

+0

По-прежнему та же проблема. – Mada

+0

@Mada Поместите некоторый фактический код, демонстрирующий поведение. Убедитесь, что он компилируется и запускается. – molbdnilo

Смежные вопросы