【问题标题】:Class enumerator values cannot be passed as parameters to another class's function类枚举器值不能作为参数传递给另一个类的函数
【发布时间】:2015-06-09 11:04:37
【问题描述】:

在我正在制作的程序中,我试图让某个类将数据作为参数传递给另一个类的函数。该数据恰好是来自第一个类的成员枚举器的变量。但是我遇到了很多错误。下面的代码是我正在尝试做的一个例子。我在他们的行上方的 cmets 中添加了错误:

ma​​in.cpp:

#include "A.h"

int main(int argc, char* args[]) {
    A a;

    a.callFunctionB();

    return 0;
}

啊:

#pragma once
#include "B.h"

class B;

class A {
public:
    enum Enumerator {x, y, z};
    void callFunctionB();
private:
    //C2146: syntax error : missing ';' before identifier 'b'
    //C4430: missing type specifier - int assumed.
    B b;
    Enumerator e = x;
};

A.cpp:

#pragma once
#include "A.h"

void A::callFunctionB() {
    //C2660: 'B::functionB' : function does not take 1 arguments
    b.functionB(e);
}

B.h:

#pragma once
#include "A.h"

class A;

class B {
public:
    //C2653: 'A': is not a class or namespace name
    //C2061: syntax error : identifier 'Enumerator'
    //C2653: 'A' is not a class or namespace name
    void functionB(A::Enumerator e);
};

B.cpp:

#pragma once
#include "B.h"
#include <iostream>

void B::functionB(A::Enumerator e) {
    std::cout << "It worked! Enumerator variable 'x' was passed to function B." << std::endl;
}

为什么我不能将一个类的成员枚举器的变量作为参数发送给另一个类的函数?

【问题讨论】:

  • 我认为您在这里遇到了包含问题。 B.h 包括A.hA.h 还包括B.h

标签: c++ class parameters header enumerator


【解决方案1】:

您有一个circular dependency problem。您的文件可以随意包含彼此,但

#pragma once

在顶部表示只有一个人看到另一个人;并不是每个人都看到对方。


这里有几种方法。

一种方法是在类之外删除A 的枚举器(可能是一些更私密的namespace)。一般来说,您希望您的班级在任何情况下都“尽可能少地了解”彼此。

【讨论】:

  • 感谢您的回答。这是一个很好的链接:) 但我想知道我是否应该忘记尝试在我的程序中使用枚举器作为参数。不过,我对命名空间的使用很好奇:在这个例子中,如果 A 类和 B 类函数都需要枚举器,你会将命名空间放在哪里?命名空间只能在包含创建它的文件的文件中使用,对吧?
  • 这确实取决于具体情况,但也许您可以尝试使用两个类都包含的一些头文件。这将打破循环依赖。
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2011-12-04
相关资源
最近更新 更多