我已经阅读了我在以下链接中找到的所有建议
- c++ typedef another class's enum?
- http://forums.devarticles.com/c-c-help-52/how-to-use-enum-when-it-is-in-another-class-17773.html
- http://forums.codeguru.com/showthread.php?t=435215
- How do I use the Enum value from a class in another part of code?
但仍然无法找到解决我的问题的方法:
I need to construct an object of
class A
(whose constructor expects as an input parameter an enumerative type of that class) from inside a function of an object ofclass 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
行的编译器中得到了这个错误:
no match for call to ‘(A) (std::basic_string, B::FileType&)’
这意味着我没有使用正确的枚举类型来调用 A class
构造函数,但我该如何解决这个问题?
我做错了什么?
最佳答案
B::FileType
和 A::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);
在调试器中单步执行以查看控制流。
关于c++ - 使用另一个类的枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928022/