2015-10-19 3 views
1

Я немного ржавый на C++, не использовал его какое-то время. Поэтому мне нужно создать структуру данных, которая может содержать объекты и выполнять с ними операции. Так же, как список массивов. Теперь я сначала создать и инициализировать динамический массив моего типа класса:Создание списка объектов в C++

Student* array_of_students = new Student[SIZE]; 

Затем я создаю объект Student, скажем так:

Student student(param1, param2, etc..); 

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

~Student(){ /* delete filed1; etc */ } 

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

Так в чем же тут решение? Как я могу держать их, пока array_of_students жив?

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

EDIT:

class Student{ 

private : 
    char *_name; 

    public : 

    Student(){} 
    Student(char* name){ 

     _name = new char[strlen(name)]; 
     strcpy(_name, name); } 

    char* getNaziv(){return _name;} 
    ~Student(){delete _name;} 

}; 

int main() 
{ 
    Student* array_of_students = new Student[5]; 
    char input[100]; 
    for(int i = 0; i < 5; i++){ 
     cout << "Input name : "<<endl; 
     cin >> input; 
     Student tmp(input); 
     array_of_students[i] = tmp; 
    } 

    for(int i = 0; i < 5; i++){ 

     cout <<"Name is : "<< array_of_students[i].getNaziv()<< endl; 
    } 
} 
+3

C++ эквивалентно список массива (в Java) является [ 'станд :: VECTOR'] (http://en.cppreference.com/w/cpp/контейнер/вектор). Пожалуйста, воздержитесь от использования необработанных массивов :) – 865719

+1

Пожалуйста, предоставьте SSCCE. – Shoe

+0

Как я уже сказал, мне не разрешено использовать векторы. Только сырые. – nhrnjic6

ответ

0

Старайтесь не использовать массивы символов для хранения строки, используйте вместо std::string. И если это возможно, не используйте ключевое слово new для выделения памяти, пусть C++ позаботится о выделении и освобождении памяти для вас.

И не используйте необработанные массивы Students, предпочтительно использовать std::vector или другие классы контейнеров. Как это:

#include <cstdlib> 
#include <iostream> 
#include <vector> 

class Student 
{ 
     private : 
       std::string _name; 

     public : 
       Student (); 
       Student (std::string& name); 

       void name (std::string&); 
       std::string& name (); 
}; 

Student::Student () 
{ 
     /* Constructor with no parameters, do some crazy stuff... */ 
} 

Student::Student (std::string& name) 
{ 
     this -> name (name); 
} 

void Student::name (std::string& name) 
{ 
     this -> _name = name; 
} 

std::string& Student::name () 
{ 
     return (this -> _name); 
} 

int main (int argc, char **argv) 
{ 
     std::vector<Student> array_of_students; 
     std::string input; 

     for(int i = 0; i < 5; i++) 
     { 
      std::cout << "Input name : " << std::endl; 
      std::cin >> input; 

      Student tmp (input); 
      array_of_students.push_back (tmp); 
     } 

     for(auto sit = array_of_students.begin (); sit != array_of_students.end (); ++ sit) 
     { 
       std::cout <<"Name is : "<< (*sit).name () << std::endl; 
     } 

     return (EXIT_SUCCESS); 
} 

Выход:

Input name : 
Name_01 
Input name : 
Name_02 
Input name : 
Name_03 
Input name : 
Name_04 
Input name : 
Name_05 
Name is : Name_01 
Name is : Name_02 
Name is : Name_03 
Name is : Name_04 
Name is : Name_05 
Смежные вопросы