Как я могу гарантировать, что перечисление, объявленное внутри класса, является управляемым перечислением? - PullRequest
1 голос
/ 06 мая 2020

В Visual C ++ (VS 2015) я могу определить управляемое перечисление следующим образом:

public enum class Pet {
    Cat,
    Dog,
    Hamster,
};

и ключевое слово publi c жизненно важно. Без него он не будет рассматривать Pet как управляемое перечисление, и вы не сможете получить доступ к тексту, связанному с членами перечисления, например, с помощью Enum :: GetName.

Однако, если я попробую и объявить перечисление внутри класса, например:

class Construction {

public :

    public enum class Fixing {
        Nut,
        Bolt,
        Rivet,
    };

};

Я получаю это сообщение об ошибке:

error C3379: 'Construction::Fixing': a nested class cannot have an assembly access specifier as part of its declaration

Если я удалю "publi c" из объявления, например это:

class Construction {

public :

    enum class Fixing {
        Nut,
        Bolt,
        Rivet,
    };

};

, а затем добавьте следующий код:

int main(array<System::String ^> ^args)
{
    array<String^> ^names = Enum::GetNames( Construction::Fixing::typeid );
    for ( int i = 0; i < names->Length; ++i ) {
        Console::WriteLine( names[ i ] );
    }
    return 0;
}

, тогда он будет компилироваться без жалоб, но результат не такой, как я мог бы ожидать. Выхода нет вообще. Проникнув глубже, я обнаружил, что Enum :: GetNames возвращает массив нулевой длины. Похоже, компилятор рассматривает исправление как неуправляемое перечисление и использует синтаксис C ++ 11 для «класса перечисления».

Итак, как мне изменить код, чтобы исправление было управляемым перечислением?

1 Ответ

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

Я разобрался. Мне нужно убедиться, что класс, в котором объявлено перечисление, является управляемым, например:

ref class Construction {

public :

    enum class Fixing {
        Nut,
        Bolt,
        Rivet,
    };

};

Затем код, записывающий имена членов, работает. Однако я все же считаю строку «enum class Fixing» довольно неоднозначной. Не сразу понятно, что это управляемое перечисление.

...