Local Classes in C++ (original) (raw)

Last Updated : 16 Nov, 2021

A class declared inside a function becomes local to that function and is called Local Class in C++.

For example, in the following program, Test is a local class in fun().

CPP `

// C++ program without any compilation error // to demonstrate a Local Class #include using namespace std;

// Creating the class void fun() { // local to fun class Test { // members of Test class }; }

// Driver Code int main() { return 0; }

`

Following are some interesting facts about Local Classes in C++:

1) A local class type name can only be used in the enclosing function.

For example, in the following program, declarations of t and tp are valid in fun(), but invalid in main().

CPP `

// A program without any compilation error to demonstrate // that a local class type name can only be used // in the enclosing function

#include using namespace std;

void fun() { // Local class class Test { // Body };

Test t; // Fine
Test* tp; // Fine

}

int main() { Test t; // Error Test* tp; // Error return 0; }

`

2) All the methods of Local classes must be defined inside the class only. For example, program 1 works fine and program 2 fails in the compilation.Program 1:

CPP `

// C++ program without any compilation error to demonstrate // that all the methods of Local classes must be defined // inside the class only #include using namespace std;

void fun() { class Test // local to fun { public: // Fine as the method is defined // inside the local class void method() { cout << "Local Class method() called"; } };

Test t;
t.method();

}

int main() { fun(); return 0; }

`

Output

Local Class method() called

Program 2:

CPP `

// C++ program with compilation error to demonstrate that // all the methods of Local classes must be defined inside // the class only #include using namespace std;

void fun() { class Test // local to fun { public: void method(); };

// Error as the method is defined outside the local
// class
void Test::method() { cout << "Local Class method()"; }

}

int main() { return 0; }

`

Output

Compiler Error: In function 'void fun()': error: a function-definition is not allowed here before '{' token

**3) A Local class cannot contain static data members. It may contain static functions though.**For example, program 1 fails in compilation, but program 2 works fine.

Program 1:

CPP `

// A program with compilation error to demonstrate that // a Local class cannot contain static data members #include using namespace std;

void fun() { class Test // local to fun { static int i; }; }

int main() { return 0; }

`

Output

Compiler Error: In function 'void fun()': error: local class 'class fun()::Test' shall not have static data member 'int fun()::Test::i'

Program 2:

CPP `

// C++ program without any compilation error to demonstrate // that a Local class cannot contain static data members #include using namespace std;

void fun() { class Test // local to fun { public: static void method() { cout << "Local Class method() called"; } };

Test::method();

}

int main() { fun(); return 0; }

`

Output

Local Class method() called

4) **Member methods of the local class can only access static and enum variables of the enclosing function. Non-static variables of the enclosing function are not accessible inside local classes.**For example, program 1 compiles and runs fine. But, program 2 fails in the compilation.Program 1:

CPP `

// C++ program without any compilation error to demonstrate // that member methods of local class can only access static // and enum variables of the enclosing function #include using namespace std;

void fun() { static int x; enum { i = 1, j = 2 };

// Local class
class Test {
public:
    void method()
    {
        cout << "x = " << x
             << endl; // fine as x is static
        cout << "i = " << i
             << endl; // fine as i is enum
    }
};

Test t;
t.method();

}

int main() { fun(); return 0; }

`

Program 2:

CPP `

// C++ program with compilation error to demonstrate that // member methods of local class can only access static // and enum variables of the enclosing function #include using namespace std;

void fun() { int x;

// Local class
class Test {
public:
    void method() { cout << "x = " << x << endl; }
};

Test t;
t.method();

}

int main() { fun(); return 0; }

`

Error:

prog.cpp: In member function ‘void fun()::Test::method()’:

prog.cpp:14:43: error: use of local variable with automatic storage from containing function

void method() { cout << "x = " << x << endl; }

^

prog.cpp:9:9: note: ‘int x’ declared here

int x;

^

5) Local classes can access global types, variables, and functions. Also, local classes can access other local classes of the same function.For example, the following program works fine.

CPP `

// C++ program without any compilation error to demonstrate // that Local classes can access global types, variables and // functions #include using namespace std;

int x;

void fun() {

// First Local class
class Test1 {
public:
    Test1() { cout << "Test1::Test1()" << endl; }
};

// Second Local class
class Test2 {
    // Fine: A local class can use other local classes
    // of same function
    Test1 t1;

public:
    void method()
    {
        // Fine: Local class member methods can access
        // global variables.
        cout << "x = " << x << endl;
    }
};

Test2 t;
t.method();

}

int main() { fun(); return 0; }

`

Output

Test1::Test1() x = 0

Must Read: Nested Classes in C++