如何通过引用传递另一个 class 函数中的枚举 class?

How to pass an enum class which is inside another class's function by reference?

我对 C++ 还是很陌生,很抱歉,如果代码有点业余,那可能是问题的根源。

我花了一些时间在这个网站和整个网络上搜索。有很多使用 enums(不是 enum class)的例子,也有很多使用 enums 和 enums class 在 classes 之外的例子,但并没有真正找到对我的特定场景有用的东西,请参见下文。当然,我可能已经看到了答案,但我的C++还不够先进,无法识别它。

基本上我想将 2 个“状态”enums class 传递到一个方法中,与枚举 class 的方法不同 class es被定义,然后根据第一个枚举class中的值改变第二个枚举class的状态。这些枚举 class 是在 class 中定义的,其中包含指向第二个 class 的指针,其中定义了该方法。 Class 声明位于头文件中,并在包含相关头文件的单独 .cpp 文件中定义。请参阅下面的详细代码和错误。

希望有人能帮我解释最后的错误信息并弄清楚如何实现这一点。

main.cpp

#include <iostream>
#include "firstfile.h"

int main() {
    FirstFile firstobject;
    firstobject.Function1();
}

基本上,我在 class.

之后有 2 enum classe

firstfile.h

#include "secondfile.h"

class FirstFile 
{
protected:
    SecondFile secondobject;

public:
    enum class enum1 {
        Option1,
        Option2
    } enumIn = enum1::Option1;

    enum class enum2 {
        Option3,
        Option4
    } enumInOut = enum2::Option3;
    // Methods
protected:
public:
    void Function1();
};

firstfile.cpp

#include <iostream>
#include "firstfile.h"

void FirstFile::Function1()
{
    std::cout << "Before the function call enumIn = Option 1 and enumInOut = Option3 " << std::endl;
    secondobject.function2(enumIn, enumInOut);

    if (enumInOut == enum2::Option4) {
        std::cout << "After the function call enumInOut = Option 4" << std::endl;
    }
    else if (enumInOut == enum2::Option3) {
        std::cout << "After the function call enumInOut = Option 3" << std::endl;
    }
    else {
        std::cout << "enumInOut didn't match either Option 3 or Option 4" << std::endl;
    }
}

头文件,大多数错误发生的地方。

secondfile.h

#include "firstfile.h"

class SecondFile 
{   
public:
    void function2(const enum1& enumIn, enum2& enumInOut);
};

最后,这是正在调用的 class2 中的方法,它应该根据 enum1 的值更新 enum2。

secondfile.cpp

#include <iostream>
#include "firstfile.h"
#include "secondfile.h"

void SecondFile::function2(const enum1& enumIn, enum2& enumInOut) 
{
    if (enumIn == FirstFile::enum1::Option1) {
        enumInOut = FirstFile::enum2::Option4;
    }
}

错误是:

firstfile.cpp
\secondfile.h(16, 28) : error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int
\secondfile.h(16, 28) : error C2143 : syntax error : missing ',' before '&'
\firstfile.cpp(8, 42) : error C2660 : 'SecondFile::function2' : function does not take 2 arguments
\secondfile.h(16, 7) : message: see declaration of 'SecondFile::function2'

Main.cpp
\secondfile.h(16, 28) : error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int
\secondfile.h(16, 28) : error C2143 : syntax error : missing ',' before '&'

secondfile.cpp
\secondfile.h(16, 28) : error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int
\secondfile.h(16, 28) : error C2143 : syntax error : missing ',' before '&'
\secondfile.cpp(5, 39) : error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int
\secondfile.cpp(5, 39) : error C2143 : syntax error : missing ',' before '&'

\secondfile.cpp(6, 6) : error C2065 : 'enumIn' : undeclared identifier
\secondfile.cpp(7, 3) : error C2065 : 'enumInOut' : undeclared identifier

希望这一切都有意义,并期待任何见解来帮助理解错误的原因以及我如何解决这些错误。 可能跟scope有关,希望能吸取经验。

您有两个问题:

  • 你有 circular dependencies,因为你把每个 class 的头添加到彼此的头文件中。您可以通过指针成员来解决它。使 class FirstFile 中的 class 成员 secondobject 作为一个指针,并在头部(即 firstfile.h 中)为 [=17] 提供前向声明=].

  • 其次,您需要指定 enum1enum2 来自哪个 class/ 范围。您可以为此使用 using specifier,枚举将可用于整个 class SecondFile 的范围。

这意味着,您需要这样的东西:(See Online)

firstfile.h

class SecondFile; // forward declaration

class FirstFile 
{
protected:
    SecondFile* secondobject{ nullptr }; // or smart pointers

public:
    // ...enums and functions
};

firstfile.cpp

#include <iostream>
#include "secondfile.h"

void FirstFile::Function1() 
{
    // ...other code
    if(secondobject)
    secondobject->function2(enumIn, enumInOut);
    //      ^^^^^^^^^^^^

}

secondfile.h

#include "firstfile.h"

class SecondFile 
{    
public:
    using enum1 = FirstFile::enum1;  // specify from where the enums are
    using enum2 = FirstFile::enum2;
    void function2(const enum1& enumIn, enum2& enumInOut);
     
    // ...other codes
};

secondfile.cpp

#include "secondfile.h"

void SecondFile::function2(const enum1& enumIn, enum2& enumInOut) 
{
    if (enumIn == enum1::Option1) {
        enumInOut = enum2::Option4;
    }
}