2014-10-22 2 views
-3

Когда я пытаюсь добавить человека в вектор, он не работает + Я не могу добавить более одного человека. Im довольно новичок в C++, и я не могу понять это. Извините за мой английский :(Спасибо за любую помощь/советы. Я искал его и пытался много чего, но не мог заставить его работать в любом случае. Что я делаю неправильно или, может быть, этот код в беспорядке?C++: распределение динамической памяти + вектор

class Osoba 
    { 
    public: 
     char *name, *surname, *phone;        
     Osoba();                 
     Osoba(const char *name, const char *surname, const char *phone);   
     ~Osoba();                
    }; 

    inline Osoba::Osoba(){}; 

    inline Osoba::Osoba(const char *name, const char *surname, const char *phone) 
    { 
     Osoba::name = new char[strlen(name) + 10];           
     strcpy(Osoba::name, name);               
     Osoba::surname = new char[strlen(surname) + 1]; 
     strcpy(Osoba::surname, surname); 
     Osoba::phone = new char[strlen(phone) + 1]; 
     strcpy(Osoba::phone, phone); 
    } 


    inline Osoba::~Osoba() 
    { 
     delete name; 
     delete surname; 
     delete phone; 
    } 


    int main() 
    { 
     const char *name2, *surname2, *phone2; 
     vector <Osoba> osoba; 

       cout << "\n1.-Workers list\n2.-Add person\n3.-Quit"; 
       char odp; 
       do 
       { 
        odp = getch(); 
        switch (odp) 
        { 
        case '1': 
         cout << "\n\n\nList:\n"; 
         for (int i = 0; i < osoba.size(); i++) 
         { 
          cout << endl; 
          cout << "Name: " << osoba[i].name << endl; 
          cout << "Surname: " << osoba[i].surname << endl; 
          cout << "Phone: " << osoba[i].phone << endl; 
         } 
         break; 
        case '2': 
         cout << "\n\nADD PERSON"; 
         cout << "\nName: "; 
         string name; 
         cin >> name; 
         name2 = name.c_str(); 
         cout << "Surname: "; 
         string surname; 
         cin >> surname; 
         surname2 = surname.c_str(); 
         cout << "Phone: "; 
         string phone; 
         cin >> phone; 
         phone2 = phone.c_str(); 
         osoba.push_back(Osoba(name2, surname2, phone2)); 
         break; 
        } 
       } while (odp != '3'); 

       return 0; 
    } 
+2

Если вы думаете, у вас есть проблемы, кладя объекты в векторах, то вы должны написать пример наименьшего рабочего кода, который подчеркивает проблему. – juanchopanza

+1

Какова фактическая ошибка? Кроме того, у вас есть несоответствие распределителя - вам нужно «удалить []» материал, выделенный с помощью 'new []'. Также у вашего класса отсутствует копирование и перемещение конструкторов. – Neil

+2

«Это не работает» ?? –

ответ

0

Есть несколько проблем:

Определить конструктор копирования, как показано ниже:

Osoba::Osoba(const Osoba& src) { 
    if (src.name != NULL) { 
    name = new char[strlen(src.name) + 1];           
    strcpy(name, src.name); 
    }              
    if (src.surname != NULL) { 
    surname = new char[strlen(src.surname) + 1];           
    strcpy(surname , src.surname); 
    }              
    if (src.phone != NULL) { 
    phone = new char[strlen(src.phone) + 1];           
    strcpy(phone, src.phone); 
    }              
} 

Изменить конструкторы, как показано ниже:

Osoba::Osoba(){ 
    name = (char *) NULL; 
    surname = (char *) NULL;; 
    phone = (char *) NULL; 
    }         
}; 

Osoba::Osoba(const char *name, const char *surname, const char *phone) 
{ 
    if (name != NULL) { 
    this->name = new char[strlen(name) + 1];           
    strcpy(this->name, name); 
    }              
    if (surname != NULL) { 
    this->surname = new char[strlen(surname) + 1];           
    strcpy(this->surname , surname); 
    }              
    if (phone != NULL) { 
    this->phone = new char[strlen(phone) + 1];           
    strcpy(this->phone, phone); 
    } 
} 

Кроме того, оператор присваивания:

Osoba& Osoba::operatoe = (const Osoba& src) { 
    if (this == &src) 
    return *this; 
    if (src.name != NULL) { 
    name = new char[strlen(src.name) + 1];           
    strcpy(name, src.name); 
    }              
    if (src.surname != NULL) { 
    surname = new char[strlen(src.surname) + 1];           
    strcpy(surname , src.surname); 
    }              
    if (src.phone != NULL) { 
    phone = new char[strlen(src.phone) + 1];           
    strcpy(phone, src.phone); 
    } 
    return *this;           
} 
+0

Все еще сломан. Что произойдет, если один из «новых» потерпит неудачу? –

+0

И ему также нужен оператор присваивания. –

+0

спасибо, @JamesKanze, отредактировал мой ans –

0

Поскольку вы делаете C++, почему бы не делать это С ++ - способ

#include <string> 

using std::string; 

class Osoba 
{ 
public:        
    Osoba() = default;                
    Osoba(const string& name, const string& surname, const string& phone); 
    Osoba(const Osoba&) = default; 
    Osoba& operator=(const Osoba&) = default; 
    ~Osoba() = default;   

    const string& Name() const { return name; } 
    const string& Surname() const { return surname; } 
    const string& Phone() const { return phone; } 

    void Name(const string& n) { name =n; } 
    void Surname(const string& s) { surname =s; } 
    void Phone(const string& p) { phone =p; } 

private: 
    string name, surname, phone;           
}; 

Osoba::Osoba(const string& name, const string& surname, const string& phone) 
    : name(name), surname(surname), phone(phone) 
{ 
} 
+1

Ваши получатели должны быть const. Они могут возвращать константную ссылку. –

+0

Вы можете отказаться от функций с надписью '= default' и скомпилировать их со всеми компиляторами C++, а не только последними. –

+0

@JamesKanze параметр 3 будет подавлять параметр no – sp2danny

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