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

Time:09-23

I am still fairly new to C , so sorry if the code is a bit amateurish, that might be the source of the problem.

I've spent some time searching this site and across the web. There are plenty of examples using enums (not enum class) and also of using enums and enums class outside of classes, but didn't really find anything useful for my particular scenario, see below. Of course, I may have seen the answer, but my C is not advanced enough yet to recognize it.

Basically I want to pass 2 "state" enums classes into a method, in a different class from the ones in which the enums classes are defined, and then change the state of the second enum class based on the value in the first enum class. These enum classes are defined inside a class which contains a pointer to the second class in which the method is defined. Class declarations are in header files and defined in separate .cpp files which include the relevant headers. See the detailed code and errors below.

Hoping someone can help me interpret the error messages at the end and figure out how to achieve this.

main.cpp

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

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

Basically, I've got 2 enum classes inside following class.

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;
    }
}

The header file, where most of the errors occur.

secondfile.h

#include "firstfile.h"

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

Finally, here is the method in class2 that is being called that should update enum2 based on the value of enum1.

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;
    }
}

The errors are:

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

Hope this all makes sense and look forward to any insights to help understand the cause of the errors and how I might be able to resolve them. It's probably related to scope, but hoping to learn from this experience.

CodePudding user response:

You have two issues:

  • You have circular dependencies, since you add the header of each classes to each other's header files. You can solve it via pointers members. Make the class member secondobject in the class FirstFile as a pointer, and provide a forward declaration in the header (i.e. in firstfile.h) for SecondFile.

  • Secondly, you need to specify the enum1 and enum2 from which class/ scope it is. You can use the using specifier for this, and enums will be available for the entire class SecondFile's scope.

That means, you need something like: (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;
    }
}

CodePudding user response:

You need to access the enums in the FirstFile class namespace. Here is an example I hope that could help:

class A
{
public:
    enum class Enum1
    {
        O1,
        O2
    };

    enum class Enum2
    {
        O1,
        O2
    };
};

class B
{
public:
    // specify the class here with A::_
    void Foo(const A::Enum1& value, const A::Enum2& value2) {}
};

int main()
{
    B b;
    b.Foo(A::Enum1::O1, A::Enum2::O2);
}
  • Related