如何通过引用传递另一个 class 函数中的枚举 class?
How to pass an enum class which is inside another class's function by reference?
我对 C++ 还是很陌生,很抱歉,如果代码有点业余,那可能是问题的根源。
我花了一些时间在这个网站和整个网络上搜索。有很多使用 enum
s(不是 enum class
)的例子,也有很多使用 enum
s 和 enum
s class 在 classes 之外的例子,但并没有真正找到对我的特定场景有用的东西,请参见下文。当然,我可能已经看到了答案,但我的C++还不够先进,无法识别它。
基本上我想将 2 个“状态”enum
s 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] 提供前向声明=].
其次,您需要指定 enum1
和 enum2
来自哪个 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;
}
}
我对 C++ 还是很陌生,很抱歉,如果代码有点业余,那可能是问题的根源。
我花了一些时间在这个网站和整个网络上搜索。有很多使用 enum
s(不是 enum class
)的例子,也有很多使用 enum
s 和 enum
s class 在 classes 之外的例子,但并没有真正找到对我的特定场景有用的东西,请参见下文。当然,我可能已经看到了答案,但我的C++还不够先进,无法识别它。
基本上我想将 2 个“状态”enum
s 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.
之后有 2enum 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] 提供前向声明=].其次,您需要指定
enum1
和enum2
来自哪个 class/ 范围。您可以为此使用using
specifier,枚举将可用于整个 classSecondFile
的范围。
这意味着,您需要这样的东西:(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;
}
}