Local Classes in C++

16 Nov, 2021
A class declared inside a function becomes local to that function and is called Local Class in C++.
A local class name can only be used locally i.e., inside the function and not outside it.
The methods of a local class must be defined inside it only.
A local class can have static functions but, not static data members.
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 <iostream>using namespace std;  // Creating the classvoid fun(){    // local to fun    class Test {        // members of Test class    };}  // Driver Codeint main() { return 0; }
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 <iostream>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 <iostream>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;}
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 <iostream>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 <iostream>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 <iostream>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;}
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 <iostream>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;}
x = 0
i = 1
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 <iostream>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 <iostream>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;}
Test1::Test1()
x = 0
Must Read: Nested Classes in C++
anshikajain26
C++
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.