【问题标题】:use enum type from another class使用另一个类的枚举类型
【发布时间】:2012-03-29 14:58:55
【问题描述】:

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

  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?

但仍然无法解决我的问题:

我需要构造一个class A 的对象(其构造函数期望作为输入 从class B的对象的函数内部参数该类的枚举类型)

这里是sn-ps的代码:

文件 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&)’

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

我做错了什么?

【问题讨论】:

  • objectOfClassB.foo_func("file_path", A::FileType::TEXT);objectOfClassB.foo_func("file_path", B::FileType::TEXT);objectOfClassB.foo_func("file_path", objectOfClassB.FileType::TEXT);
  • 说真的,您发布的链接有答案。
  • @R.MartinhoFernandes 请阅读所有问题,因为在 B.h 引用中我说它不起作用!
  • A::TEXT, A::BIN,就像他们使用ns::cls::black而不是ns::cls::color::black的链接之一。
  • @R.MartinhoFernandes 这行不通!我不知道为什么它总是给出相同的错误..我在发布之前尝试了几种解决方案..

标签: c++ class enums


【解决方案1】:

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

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

objectOfClassA 已经在 foo_func 中构建。调用this-&gt;objectOfClassA(filename, type) 是尝试在对象上使用重载的 () 运算符;该运算符不存在,因此代码无法编译。您只能使用初始化符号通过 B 的构造函数构造 objectOfClassA,例如

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

然后在 main 你会这样做:

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

在调试器中单步执行以查看控制流。

【讨论】:

  • 所以这条线enum FileType{TEXT = A::FileType::TEXT, BIN = A::FileType::BIN}; 将不起作用,除非我明确键入def A::FileType?感谢您让我注意到编译器在抱怨什么!
  • 我的意思是去掉那一行,改用 typedef
  • 我尝试过在Class A 中使用typedef,然后在Class B 的函数体内使用A::FileType::TEXT,但它仍然不起作用!问题可能是由于类是模板化的吗?我没有指出它有问题,因为我认为它不相关,但也许它是。 (在这里查看stackoverflow.com/questions/9940883/…
  • Eddie 你能告诉我为什么我不能调用Class A 的构造函数,即使现在我修复了enum type 问题?我应该使用什么语法来代替this-&gt;objectOfClassA(filename, type);
  • Matteo,我不知道如何在这个网站上收到消息通知 :) 抱歉,我没有看到你的消息。简短的回答:保持 A 类的定义与上面的完全一样。对于 B,从标头中删除 enum 和 foo_func,并添加一个构造函数签名 B(const std::string&amp; filename, FileType type),就像对 A 一样。对于 B 的 cpp 文件,添加我给出的构造函数并删除 foo_func。对于 main,删除 foo_func 并像我的答案中最后一个代码 sn-p 一样初始化 B。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2012-07-07
  • 2016-11-10
  • 2023-03-16
相关资源
最近更新 更多