Реализация метода класса с типом возвращаемых данных enum

Тема в разделе "Arduino & Shields", создана пользователем Valrond, 13 дек 2018.

  1. Valrond

    Valrond Нуб

    Доброго времени. Столкнулся со следующей проблемой при написании библиотеки не могу реализовать метод класса в файле .cpp - выдает ошибку, что мол тип данных State не верен.
    Код для foo.h
    Код (C++):
    #ifndef Foo_h
    #define Foo_h

    #include "Arduino.h"
    class Foo{
    public:
    Foo ();
    enum State{
        A,
        B,
        C,
        D
    };
    State physState(){return State::B;};
    };
    #endif
    код для foo.cpp
    Код (C++):
    #include "Arduino.h"
    #include "Foo.h"
    Foo::Foo(){};

    //State Foo::physState(){return State::B;};
    При такой реализации метода ( в файле .h) проблем с типами не возникает, но если реализацию делать как положено в файле .cpp, то возникает ошибка при компиляции.
    файл .h
    Код (C++):
    #ifndef Foo_h
    #define Foo_h

    #include "Arduino.h"
    class Foo{
    public:
    Foo ();
    enum State{
        A,
        B,
        C,
        D
    };
    State physState();
    };
    #endif
    файл .cpp
    Код (C++):
    #include "Arduino.h"
    #include "Foo.h"
    Foo::Foo(){};

    State Foo::physState(){return State::B;};
    ОШИБКА:
    S:\arduino\DATAArduino\libraries\FOO\Foo.cpp:5:1: error: 'State' does not name a type

    State Foo::physState(){return State::B;};

    Подскажите пожалуйста в чем дело?
     
  2. DIYMan

    DIYMan Guest

    Код (C++):
    typedef enum
    {
    ....
    } State;
     
    Andrey12 и DetSimen нравится это.
  3. DetSimen

    DetSimen Guest

    из рабочего:


    Код (C++):
    enum class enumClassState: uint8_t {Unknown=0, Normal, Error};

    class TClass {
    private:
      enumClassState fstate;

    public:
      enumClassState  getState() const;

    }

    cpp файл:

    enumClassState  TClass::getState() const{
    return fstate;
    }
     
     
    Andrey12 нравится это.
  4. AlexU

    AlexU Гуру

    Перечисление объявили внутри класса, а ссылаетесь без класса.
    Код (C++):
    Foo::State Foo::physState() {
        return Foo::State::B;
    };
    Или декларацию перечисления выносите за пределы класса.
     
    Valrond и DetSimen нравится это.
  5. Valrond

    Valrond Нуб

    Вот спасибо Вам! Добрый человек. Помогло! Из сказанного Вами я понял что при определении нового типа данных в классе, в последующем нужно указывать из какого класса этот тип?
     
  6. AlexU

    AlexU Гуру

    В общем случае это относится ко всему, что объявляется внутри декларации класса, за исключением не статических полей и методов (надеюсь ни чего не упустил). Вот в класе Foo объявлен конструктор. Соответственно за пределами декларации класса на этот конструктор ссылаются вместе с именем класа. Что видно в *.cpp файле:
    Код (C++):
    Foo::Foo(){};
     
    DetSimen нравится это.