используйте тип enum из другого класса - PullRequest
2 голосов
/ 29 марта 2012

Я прочитал все предложения, которые я нашел в следующих ссылках

  1. c ++ typedef перечисление другого класса?
  2. http://forums.devarticles.com/c-c-help-52/how-to-use-enum-when-it-is-in-another-class-17773.html
  3. http://forums.codeguru.com/showthread.php?t=435215
  4. Как использовать значение Enum из класса в другой части кода?

но так и не смог найти решение моей проблемы:

Мне нужно создать объект class A (чей конструктор ожидает в качестве ввода параметр перечислимого типа этого класса) изнутри функции объекта class B

Вот фрагменты кода:

Файл A.h:

Class A{
    public:
       enum FileType{TEXT, BIN};

       /*! This constructor initializes the data from a given file
        *  (binary, text, image). 
        */
       A(const std::string& filename, FileType type);

}

Файл A.cpp:

A::A(const std::string& filename, FileType type){
 ...
}

Файл B.h:

Class B{

    private:
       A objectOfClassA;

    public:
       enum FileType{TEXT = A::FileType::TEXT, BIN = A::FileType::BIN}; //<----THIS IS NOT WORKING!           
       foo_func(const std::string& filename, FileType type);

}

Файл B.cpp:

void B::foo_func(const std::string& filename, FileType type){

    this->objectOfClassA(filename, type); //should construct an object of class A
    ... //do stuff with objectOfClassA
}

Файл main.cpp:

int main(int argc, char** argv) {

    B objectOfClassB;
    objectOfClassB.foo_func("file_path", foo_func.TEXT);

}

При попытке запустить основную программу я получаю эту ошибку от компилятора в файле B.cpp в строке функции foo_func:

нет совпадений для вызова ‘(A) (std :: basic_string, B :: FileType &) ’

, что означает, что я не использую правильный тип перечисления для вызова A class конструктора, но как я могу это исправить?

Что я делаю не так?

1 Ответ

6 голосов
/ 29 марта 2012

B::FileType и A::FileType - это разные типы.Вам нужно typedef A::FileType FileType внутри B, чтобы правильно совмещать типы, чтобы они были взаимозаменяемыми.В противном случае B::FileType - это перечисление, которое структурно совпадает с A::FileType, но не связано с системой типов.Это ответит на ваш основной вопрос.

Исправление этого по-прежнему не позволит компилировать ваш код, однако, и это не то, на что жалуется ошибка.

objectOfClassA уже создан внутри foo_func.Вызов this->objectOfClassA(filename, type) является попыткой использования оператора overloaded () для объекта;этот оператор не существует, поэтому код не может быть скомпилирован.Вы можете создать objectOfClassA только через конструктор B, используя нотацию инициализатора, например,

B::B(const std::string& filename, FileType type) : objectOfClassA(filename, type)
{
  ...
}

Тогда в main вы сделаете это:

B objectOfClassB("file_path", B::TEXT);

Выполните шаги в отладчике, чтобы увидеть поток управления.

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