从另一个类使用枚举类型

3

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

  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 B的函数内部构造class A的对象(其构造函数期望该类的枚举类型作为输入参数)

以下是代码片段:

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){
 ...
}

File 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函数行处获得了以下错误信息:

no match for call to ‘(A) (std::basic_string, B::FileType&)’

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

1
objectOfClassB.foo_func("file_path", A::FileType::TEXT); 或者 objectOfClassB.foo_func("file_path", B::FileType::TEXT); 或者 objectOfClassB.foo_func("file_path", objectOfClassB.FileType::TEXT); - karlphillip
说真的,你发的链接里面已经有答案了。 - R. Martinho Fernandes
@R.MartinhoFernandes请仔细阅读所有问题,因为在B.h引用中我说它没有起作用! - Matteo
A::TEXTA::BIN,就像其中一个链接中使用的ns::cls::black一样,而不是ns::cls::color::black - R. Martinho Fernandes
@R.MartinhoFernandes 这不会起作用!我不知道为什么它总是给出相同的错误..在发布之前,我尝试了几种解决方案.. - Matteo
1个回答

7

B::FileTypeA::FileType是不同的类型。你需要在B内使用typedef A::FileType FileType来正确地定义这些类型的别名,以便它们可以互换使用。否则,B::FileType是一个枚举类型,与A::FileType在类型系统中没有关联,但在结构上是相同的。这回答了你的主要问题。

然而,即使修复了这个问题,你的代码也无法编译,并且错误信息并不是在抱怨这个问题。

objectOfClassA已经在foo_func内被构建。调用this->objectOfClassA(filename, type)是试图在对象上使用重载的()运算符;由于这个运算符不存在,因此代码无法编译。你只能通过B的构造函数使用初始化语法来构造objectOfClassA,例如:

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

然后在主函数中,您需要执行以下操作:
B objectOfClassB("file_path", B::TEXT);

通过调试器逐步执行以查看控制流程。


所以这行代码 enum FileType{TEXT = A::FileType::TEXT, BIN = A::FileType::BIN}; 除非我明确地 typedef A::FileType,否则它将无法工作?感谢您让我注意到编译器正在抱怨的问题! - Matteo
我是说只需删除那行代码,使用typedef即可。 - Eddie Edwards
我已经尝试在A类中使用typedef,然后在B类函数体内部仅使用A :: FileType :: TEXT,但它仍然无法工作!问题可能是由于类是模板化的吗?我在问题中没有指出这一点,因为我认为这不相关,但也许它是。(在此处检查http://stackoverflow.com/questions/9940883/does-templatization-affect-enum-type-syntax) - Matteo
Eddie,请问为什么我即使已经解决了“枚举类型”问题,仍然无法调用Class A的构造函数?我应该使用什么语法来代替this->objectOfClassA(filename, type); - Matteo
1
Matteo,我还不知道如何在这个网站上接收消息通知 :) 很抱歉我没有看到你的消息。简短回答:保持类A的定义与您上面所写的完全相同。对于B,从头文件中删除枚举和foo_func,并添加一个构造函数签名B(const std::string& filename, FileType type),就像A一样。对于B的cpp文件,添加我给出的构造函数并删除foo_func。对于main函数,删除foo_func并按照我答案中最后一个代码片段中的方式初始化B。 - Eddie Edwards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接