#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