C++:动态内存分配+向量

C++:动态内存分配+向量,c++,vector,C++,Vector,当我尝试将person添加到vector时,它不起作用+我不能添加多个人。我对C++很陌生,我无法理解。对不起我的英语:谢谢你的帮助/提示。我一直在寻找它,尝试了很多东西,但无论如何都没能成功。我做错了什么,或者这个代码乱七八糟 class Osoba { public: char *name, *surname, *phone; Osoba();

当我尝试将person添加到vector时,它不起作用+我不能添加多个人。我对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;
    }

问题不多:

定义复制构造函数如下:

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(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;                                         
}

<>既然你在做C++,为什么不做C++的方式< /p>
#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)
{
}

如果您认为在将对象放入向量时遇到问题,那么您应该编写最小的工作代码示例来突出问题。实际错误是什么?此外,您还有一个分配器不匹配-您需要删除用新[]分配的[]内容。此外,您的类缺少复制和移动构造函数。问题是您缺少复制构造函数,并且您的删除缺少[]。为什么不通篇使用std::string并停止担心char*?为了详细说明@juanchopanza的观点,如果Osoba只包含姓名,但不包含姓氏或电话,您是否仍然有问题?如果你正在研究的问题可以用结构的一个领域来证明,那么你为什么要提出三个领域?为什么不是一百?要帮助思考如何优化问题,请参见帮助中心中的…并注意,有一个编辑按钮可以改进您的问题。好,好。下班后我会解决这个问题。抱歉弄得一团糟。我应该阅读所有关于在这里发布的信息。你的获取者应该是const。它们可以返回一个const引用。您可以删除标记为默认的函数,并用所有C++编译器编译,而不只是最新的。@ JAMESCKEZE 3参数之一将抑制没有参数的中断。如果一个新的失败了怎么办?他还需要一个赋值运算符。@JamesKanze试着用编辑过的ans,新的通常不会失败,除非你耗尽堆中仍然不安全的异常。堆是一个有限的资源,如果new失败,您不应该泄漏内存。如果没有在src中设置,您不应该复制构造函数清除成员