У меня возникли трудности с инициализацией перечисления в конструкторе на C

#c #enums

#c #перечисления

Вопрос:

Я использую enum для инициализации разных полов. Итак, моя проблема в том, что я не знаю, что именно нужно поместить в этот конструктор.

 class CPerson {
private:
    char* Name;
    enum class Gender { Male = 0, Female = 1 };
    Gender sex;
public:
CPerson(const char* szName, Gender s)
        :Name{ nullptr }
    {
        Name = new char[strlen(szName)   1];
        strcpy(Name, szName);
        sex =s ;
    }

void main(){
Cperson("Simon",?????);
}
  

Комментарии:

1. Вам нужно сделать перечисление общедоступным

2. ваше перечисление является закрытым в CPerson, его нельзя использовать из него, зачем это делать? Исходя из этого , как насчет того, чтобы использовать a std::string для имени ? Кроме того , почему Имя , а не имя ?

3. Это назначение в конструкторе. Вы можете инициализировать элементы только в списке инициализаторов.

4. Это домашнее задание для университета, и они хотят использовать char* , а затем std::string

5. Неудачно. Остерегайтесь правила 3/5/0 .

Ответ №1:

Поскольку ваше перечисление является частью класса, вам необходимо сослаться на имя класса, чтобы получить доступ.

И поскольку вы создали Gender класс вместо простого перечисления, вам тоже придется ссылаться на него.

 CPerson("Simon", CPerson::Gender::Male);
  

Кроме того, как отмечено в комментариях, вам необходимо сделать перечисление общедоступным.

Комментарии:

1. @FredLarson Я думал, что отдельные имена перечислений также были определены во включающей области.

2. @FredLarson о, это забавно, мои глаза полностью закрыли слово «класс». Дважды.

3. Да, я знаю это чувство.

Ответ №2:

Чтобы создать экземпляр вашего класса Enum, вы должны выбрать что-то вроде :

 CPerson("Simon", CPerson::Male);
  

В качестве примечания, если ваши члены Enum будут следовать порядку 0,1,2 …., вам не нужно явно вводить so :

 enum class Gender { Male,Female};
  

должно быть достаточно.

Комментарии:

1. Перечисление является закрытым

2. Это класс enum, имена не попадают во охватывающую область. Вы должны ссылаться на них как CPerson::Gender::Male