Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Local Class ใน C++ (คลาสภายในฟังก์ชัน)

Local Class คือ คลาสที่ประกาศ ภายในฟังก์ชัน (Function) หรือ Block ใช้ได้เฉพาะใน Scope นั้นๆ เท่านั้น

ลักษณะสำคัญ

  • Scope จำกัดอยู่ใน Function/Block ที่ประกาศ
  • ไม่สามารถเข้าถึงได้จากภายนอก Function
  • Member Functions ต้อง Define ภายใน Class Definition เท่านั้น
  • ไม่สามารถมี Static Data Members (แต่ Static Functions ได้)
  • ไม่สามารถสืบทอด (Inherit) จาก Local Class ได้
  • สามารถเข้าถึง Static/Extern Variables และ Global Variables ของ Enclosing Scope ได้
  • ไม่สามารถเข้าถึง Local Variables (Non-static) ของ Enclosing Function ได้

โค้ดตัวอย่างพื้นฐาน

#include <iostream>
using namespace std;

void func() {
    class LocalClass {
    private:
        int num;
    public:
        void setData(int n) { num = n; }
        void showData() { cout << "Number: " << num << endl; }
    };
    
    LocalClass obj;
    obj.setData(7);
    obj.showData();
}

int main() {
    cout << "Demo Local Class" << endl;
    func();
    // LocalClass obj2;  // ❌ Error: ไม่รู้จัก LocalClass
    return 0;
}

ผลลัพธ์

Demo Local Class
Number: 7

กฎการเข้าถึงตัวแปร (Access Rules)


int globalVar = 100;

void outerFunc() {
    int localVar = 10;      // Local Variable (Non-static)
    static int staticVar = 20;  // Static Local Variable
    
    class LocalClass {
    public:
        void access() {
            cout << "Global: " << globalVar << endl;      // ✓ OK
            cout << "Static Local: " << staticVar << endl;  // ✓ OK
            // cout << localVar;  // ❌ Error: ไม่เข้าถึง non-static local variable
        }
    };
    
    LocalClass obj;
    obj.access();
}

Static Members ใน Local Class


void func() {
    class LocalClass {
    public:
        static int count;      // ❌ Error: Static Data Member ไม่ได้ใน Local Class
        static void hello() {  // ✓ OK: Static Function ได้
            cout << "Hello from Local Class" << endl;
        }
    };
    
    // int LocalClass::count = 0;  // ❌ ไม่ได้ define static data member
    LocalClass::hello();  // เรียก static function ได้
}

การใช้งานจริง: Functor / Lambda Alternative


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void processVector(vector<int>& v) {
    // Local Class เป็น Predicate สำหรับ sort
    class DescendingCompare {
    public:
        bool operator()(int a, int b) const {
            return a > b;  // เรียงมากไปน้อย
        }
    };
    
    sort(v.begin(), v.end(), DescendingCompare());
}

int main() {
    vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};
    processVector(vec);
    for (int x : vec) cout << x << " ";  // 9 6 5 4 3 2 1 1
    return 0;
}

Local Class vs Lambda (C++11+)

คุณสมบัติ Local Class Lambda Expression
SyntaxVerboseConcise
Capture Variablesไม่ได้ (Non-static locals)ได้ (Capture list)
Statefulได้ (Member Variables)ได้ (Capture by value/ref)
Reusableได้ (Named Type)ยาก (Unnamed Type)
Template Friendlyได้ยาก (Generic Lambda C++14+)
C++ VersionC++98C++11

เมื่อไหร่ควรใช้ Local Class?

  • ต้องการ Type ที่มีชื่อ (Named Type) สำหรับ Template
  • Logic ซับซ้อนกว่า Lambda หนึ่งบรรทัด
  • ต้องการ Multiple Member Functions
  • Codebase เก่าที่ไม่รองรับ C++11
  • Implementation Detail ที่ไม่ต้องการ Expose ออกไป

ข้อจำกัดสำคัญ (C++ Standard)

  1. No Static Data Members
  2. No Member Templates
  3. No Friend Declarations (C++11 เปลี่ยน: ได้แล้ว)
  4. Cannot be used as Template Argument (C++11 เปลี่ยน: ได้แล้ว)
  5. Cannot inherit from Local Class
  6. Enclosing Function ไม่มี Special Access ถึง Local Class Members