Как использовать перечисления с функциями в c ++? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь написать функцию GetSex(), которая устанавливает значение перечисления Sex и выводит его на консоль на C ++, используя значение из внешнего файла .txt, но я получаю всевозможные ошибки компиляции из-за на неправильный синтаксис.

Что здесь не так?

Код:

Sex GetSex(fstream&); //function prototype
enum Sex {M, F}; 

int main()
{
    fstream inStream("InputText.txt"); //create fstream object
    Sex mySex;  // create enum object
    mySex = GetSex(inStream); 
    cout << "Sex of first person is " << mySex;
    return 0;
}

Sex GetSex(fstream& inStream)
{
   //read in next letter in file
    char sexChar;
    inStream.get(sexChar);

    // set enum from char
    Sex mySex = static_cast<Sex>(sexChar);
    return mySex;
}

InputText.txt содержит отдельные символы, каждый в новой строке, указывающий пол человека:

M
F
M
F

Ошибки:

ошибка C4430: отсутствует спецификатор типа - предполагается int. Примечание. C ++ не поддерживает default-int

(10,5): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором GetSex

(21,9): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором «mySex»

(21,9): ошибка C2065: «mySex»: необъявленный идентификатор

(22,5): ошибка C2065: «mySex»: необъявленный идентификатор

(22,13): ошибка C3861: 'GetSex': идентификатор не найден

(23,42): ошибка C2065: 'mySex': необъявленный идентификатор

(42,11 ): ошибка C4430: отсутствует спецификатор типа - предполагается int. Примечание: C ++ не поддерживает default-int

(42,1): ошибка C2086: 'int Sex': переопределение

(10): message: см. Объявление 'Sex'

(42,5): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'GetSex'

(43,1): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '{'

(43,1): ошибка C2447: '{': отсутствует заголовок функции (формальный список в старом стиле?)

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Придется написать какую-нибудь функцию преобразования. Что-то вроде:

std::optional<Sex> CharToSex(char c) {
    switch (c) {
        case 'M':
        case 'm':
            return Sex::M;
        case 'F':
        case 'f': 
            return Sex::F;
        default:
            return std::nullopt;
    }
}

Если вам не нравится std::optional, вы можете вместо этого использовать исключение.

Вам также придется объявить CharToSex выше там, где вы его используете, но это не имеет отношения к вашему вопросу.

Ошибка вашего компилятора связана с тем, что пол не известен в GetSex ()

Просто поменяйте местами определение перечисления и объявление функции.

1 голос
/ 25 мая 2020

После перемещения enum Sex {M, F}; над объявлением функции и добавления отсутствующих включений и using namespace std; я не получаю ошибок.

Но все же Sex mySex = static_cast<Sex>(sexChar); не делает то, что вы думаете. Нет встроенного способа преобразовать строку (или символ) в перечисление. (См. Другой ответ, чтобы узнать, как это можно сделать.)

Вместо этого эта строка обрабатывает sexChar как значение numeri c и создает Sex с этим значением numeri c. static_cast<Sex>(0) даст вам M, а static_cast<Sex>(1) даст вам F. Приведение любого другого числа к Sex вызывает неопределенное поведение. (В некоторых случаях разрешено приводить число к перечислению, даже если оно не имеет константы с таким значением, но здесь это не применяется; более подробную информацию можно найти в cppreference ).

0 голосов
/ 25 мая 2020

Заменить:

Sex GetSex(fstream&);
enum Sex { M, F };

в:

enum Sex { M, F };
Sex GetSex(fstream&);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...