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 |
|---|---|---|
| Syntax | Verbose | Concise |
| 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++ Version | C++98 | C++11 |
เมื่อไหร่ควรใช้ Local Class?
- ต้องการ Type ที่มีชื่อ (Named Type) สำหรับ Template
- Logic ซับซ้อนกว่า Lambda หนึ่งบรรทัด
- ต้องการ Multiple Member Functions
- Codebase เก่าที่ไม่รองรับ C++11
- Implementation Detail ที่ไม่ต้องการ Expose ออกไป
ข้อจำกัดสำคัญ (C++ Standard)
- No Static Data Members
- No Member Templates
- No Friend Declarations (C++11 เปลี่ยน: ได้แล้ว)
- Cannot be used as Template Argument (C++11 เปลี่ยน: ได้แล้ว)
- Cannot inherit from Local Class
- Enclosing Function ไม่มี Special Access ถึง Local Class Members