Рубрики

Локальные классы в C ++

Класс, объявленный внутри функции, становится локальным для этой функции и называется локальным классом в C ++. Например, в следующей программе Test является локальным классом в fun ().

#include<iostream>

using namespace std;

  

void fun()  

{

      class Test  // местный к веселью

      {

        / * члены тестового класса * /

      };

}

  

int main()

{

    return 0;

}

Ниже приведены некоторые интересные факты о местных классах.
1) Локальное имя типа класса может использоваться только в функции включения. Например, в следующей программе объявления t и tp допустимы в fun (), но недопустимы в main ().

#include<iostream>

using namespace std;

  

void fun()  

{       

      // Локальный класс

      class Test  

      {

        / * ... * /      

      };

  

      Test t;  // Отлично

      Test *tp;  // Отлично

}

  

int main()

{

    Test t;  // Ошибка

    Test *tp;  // Ошибка

    return 0;

}

2) Все методы локальных классов должны быть определены только внутри класса. Например, программа 1 работает нормально, а программа 2 не скомпилируется.

// ПРОГРАММА 1
#include<iostream>

using namespace std;

  

void fun()  

{

    class Test  // местный к веселью

    {

    public:

    

       // Отлично, так как метод определен внутри локального класса

       void method() {

          cout << "Local Class method() called";

       }

    };      

  

    Test t;

    t.method();  

}

  

int main()

{

    fun();

    return 0;

}

Выход:

Local Class method() called

// ПРОГРАММА 2
#include<iostream>

using namespace std;

  

void fun()

{

    class Test  // местный к веселью

    {

    public:

        void method();

    };

      

    // Ошибка, поскольку метод определен вне локального класса

    void Test::method()

    {

        cout << "Local Class method()";

    }

}

  

int main()

{

    return 0;

}

Выход:

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

3) Локальный класс не может содержать статических членов данных. Хотя он может содержать статические функции. Например, программа 1 завершается неудачно при компиляции, но программа 2 работает нормально.

// ПРОГРАММА 1
#include<iostream>

using namespace std;

  

void fun()  

{

      class Test  // местный к веселью

      {

         static int i;

      };

}

  

int main()

{

    return 0;

}

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

// ПРОГРАММА 2
#include<iostream>

using namespace std;

  

void fun()

{

    class Test  // местный к веселью

    {

    public:

        static void method()

        {

            cout << "Local Class method() called";

        }

    };

  

    Test::method();

}

  

int main()

{

    fun();

    return 0;

}

Выход:

Local Class method() called

4) Методы-члены локального класса могут обращаться только к статическим и перечислимым переменным включающей функции. Нестатические переменные вмещающей функции недоступны внутри локальных классов. Например, программа 1 компилируется и работает нормально. Но программа 2 терпит неудачу при компиляции.

// ПРОГРАММА 1
#include<iostream>

using namespace std;

  

void fun()  

{

      static int x;

      enum {i = 1, j = 2};

  

      // Локальный класс

      class Test

      {

        public:

          void method() {

              cout << "x = " << x << endl;   // хорошо, так как х статичен

              cout << "i = " << i << endl;   // хорошо, как я enum

          }

      };

  

      Test t;

      t.method();

}

  

int main()

{

    fun();

    return 0;

}

Выход:

x = 0
i = 1

// ПРОГРАММА 2
#include<iostream>

using namespace std;

  

void fun()  

{

      int x;

  

      // Локальный класс

      class Test

      {

        public:

          void method() {

              cout << "x = " << x << endl;

          }

      };

  

      Test t;

      t.method();

}

  

int main()

{

    fun();

    return 0;

}

Выход:

  In member function 'void fun()::Test::method()':
  error: use of 'auto' variable from containing function

5) Локальные классы могут обращаться к глобальным типам, переменным и функциям. Кроме того, локальные классы могут обращаться к другим локальным классам той же функции. , Например, следующая программа работает нормально.

#include<iostream>

using namespace std;

  

int x;

  

void fun()  

{

  

      // Первый Локальный класс

      class Test1 {

      public:

         Test1() { cout << "Test1::Test1()" << endl; }

      };

  

      // Второй Локальный класс

      class Test2

      {

           // Хорошо: локальный класс может использовать другие локальные классы той же функции

           Test1 t1;

      public:

          void method() {

              // Fine: локальные методы члена класса могут обращаться к глобальным переменным.

              cout << "x = " << x << endl;

          }

      };

  

      Test2 t;

      t.method();

}

  

int main()

{

    fun();

    return 0;

}

Выход:

Test1::Test1()
x = 0

Также см. Вложенные классы в C ++

Ссылки:
Локальные классы (только C ++)
Местные Классы

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Локальные классы в C ++

0.00 (0%) 0 votes