使用另一个类的枚举类型

时间:2012-03-29 14:58:56

标签: c++ class enums

我已经阅读了以下链接中的所有建议

  1. c++ typedef another class's enum?
  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. How do I use the Enum value from a class in another part of code?
  5. 但仍无法找到问题的解决方案:

      

    我需要构造一个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);
    
    }
    

    通过尝试运行主程序,我在函数foo_func B.cpp 文件中的编译器中收到此错误:

      

    无法拨打'(A)   (std :: basic_string,B :: FileType&amp;)'

    这意味着我没有使用正确的枚举类型来调用A class构造函数,但是如何解决这个问题?

    我做错了什么?

1 个答案:

答案 0 :(得分:6)

B::FileTypeA::FileType是不同的类型。您需要在B内部typedef A::FileType FileType正确别名类型,以便它们可以互换。否则B::FileType是一个枚举,结构上A::FileType相同,但在类型系统中不相关。这回答了您的主要问题。

但是,修复此问题仍然不允许编译代码,这不是错误所抱怨的内容。

objectOfClassA已在foo_func中构造。调用this->objectOfClassA(filename, type)是尝试在对象上使用overloaded()运算符;此运算符不存在,因此代码无法编译。您只能使用初始化符号表示构造函数来构造objectOfClassA,例如

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

然后在main中你会这样做:

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

在调试器中逐步查看控制流程。