Инициализировать вектор STL с объектом типа CPerson (class) в C ++? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть класс CPerson, и я хочу инициализировать вектор типа CPerson переменными объекта.Однако компилятор говорит, что type name is not allowed.Я хотел бы спросить, почему это?

class CPerson {
protected:
    string m_strName; 
    Sex m_Sex; 
    Titles m_Title; 
public:
    CPerson() {
        m_strName = "Peter Petrov";
        m_Sex = male;
        m_Title = bachelor;
    }
    //добавяме параметричен к-р
    CPerson(string n,Sex s,Titles t) {
        m_strName = n;
        m_Sex = s;
        m_Title = t;
    }
    ~CPerson() {}
    void SetName(string strName) {
        m_strName = strName;
    }
    void SetSex(Sex sex) {
        m_Sex = sex;
    }
    void SetTitle(Titles title) {
        m_Title = title;
    }
    string GetName() const {
        return m_strName;
    }
};

int main(){
vector <CPerson> perr = { CPerson p1,
    CPerson p2("I.Ivanov", male, professor),
    CPerson p3("A.Stoyanova", female, assistant),
    CPerson  p4("A.Dimitrova", female, assistant)}
    return 0;
} 

1 Ответ

0 голосов
/ 28 октября 2018

В вашем коде много проблем.Вот версия кода, которая успешно компилируется:

// Example program
#include <iostream>
#include <string>
#include <vector>

enum class Sex {
    male, female
};

enum class Titles {
    bachelor,
    assistant,
    professor
};

class CPerson {
protected:
    std::string m_strName; 
    Sex m_Sex; 
    Titles m_Title; 
public:
    CPerson() {
        m_strName = "Peter Petrov";
        m_Sex = Sex::male;
        m_Title = Titles::bachelor;
    }
    //добавяме параметричен к-р
    CPerson(std::string n,Sex s,Titles t) {
        m_strName = n;
        m_Sex = s;
        m_Title = t;
    }

    void SetName(std::string strName) {
        m_strName = strName;
    }
    void SetSex(Sex sex) {
        m_Sex = sex;
    }
    void SetTitle(Titles title) {
        m_Title = title;
    }
    std::string GetName() const {
        return m_strName;
    }
};

int main(){
    std::vector <CPerson> perr({ 
        CPerson(),
        CPerson("I.Ivanov", Sex::male, Titles::professor),
        CPerson("A.Stoyanova", Sex::female, Titles::assistant),
        CPerson("A.Dimitrova", Sex::female, Titles::assistant)
    });
    return 0;
} 

Помимо отсутствующих типов для Пола и Титулов, основная проблема заключалась в синтаксисе вашего векторного инициализатора.Я предполагаю, что вы пытались использовать список инициализаторов, но ваш синтаксис был неверным.Похоже, вы просто копировали в нее операторы объявления / инициализации переменных, но вам нужно создать новые экземпляры вашего CPerson класса.Затем эти экземпляры будут скопированы в вектор.

CPerson p2("I.Ivanov", male, professor)

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

CPerson("I.Ivanov", Sex::male, Titles::professor)

Это создает экземпляр CPerson, и этот экземпляр затем копируется в вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...