Как объявить перечисления как extern со значениями по умолчанию - PullRequest
0 голосов
/ 27 января 2020

Я хочу создать перечисление в C ++ 11 таким образом, чтобы я мог объявить значение некоторых констант в исходном коде при объявлении их в заголовочном файле:

A.hpp

typedef enum class ABC: uint8_t
{
    CAR,
    DOG,
    HOUSE
};
extern ABC ABCType;

A. cpp

#include "A.hpp"

ABCType = { CAR = 1, DOG = 2, HOUSE = 3 };

Причина, по которой это необходимо, состоит в том, что начальные значения enum зависят от некоторых других объявлений библиотеки и должны быть неизменяемыми для пользователей (просто требование стиля кодирования для меня). Таким образом, пользователь может использовать что-то вроде следующего:

#include "A.hpp"

int classA::method()
{
    ...
    check(ABCType.HOUSE);
    ...
}

Я пробовал это, но VC ++ IDE говорит "слишком много значений инициализатора", почему это так?

Ответы [ 3 ]

1 голос
/ 27 января 2020

Возможно, это не совсем то, что вы хотите, но может быть полезно.

scoped_opaque_enum.hpp

#pragma once
#include <cstdint>

enum class ABC : uint8_t;

extern ABC CAR, DOG, HOUSE;

scoped_opaque_enum. cpp

#include "scoped_opaque_enum.hpp"

ABC CAR = static_cast<ABC>(1), DOG = static_cast<ABC>(2), HOUSE = static_cast<ABC>(3);

use_soe. cpp

#include "scoped_opaque_enum.hpp"

#include <iostream>

int main() {
    std::cout << static_cast<int>(CAR) << '\n';
}

0 голосов
/ 27 января 2020

Ваши собственные требования не проблема, это единственный способ в C ++. После того, как вы определите класс enum, значения в is будут считаться константами.

Если вы считаете:

enum class Ext { SOME_VALUE};

И вам нужно число c значений после него, я предлагаю написать:

enum class E : std:: underlying_t<Ext > { 
    CAT = static_cast<std:: underlying_t<Ext >>(Ext::SOME_VALUE)+1,
    DOG
  };

Таким образом, CAT определяется как значение, превышающее SOME_VALUE, и DOG как значение, превышающее CAT (всегда предыдущий + 1).

0 голосов
/ 27 января 2020

Enum не является списком констант с различными значениями (которые будут определены позже). Enum определяет значения для элементов только при объявлении. В вашем примере «CAR» будет иметь значение «0» (а «HOUSE» равно 2) и т. Д. c.

. Для ваших требований вы можете создать класс с некоторыми константами или функциями, которые возвращают ценности. Вы создаете дочерние классы с дополнительными значениями, et c.

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