class A; // 前置宣告
void test() {
A a; // 錯誤 C2079: 'a' uses undefined class 'A'
}
class A {}; // 定義在後面
前置宣告僅告知編譯器「A 是一個類別型別」,但不知其大小、佈局、建構子。編譯器無法在堆疊上配置 A a 所需的記憶體空間,故報錯 C2079(不完全型別)。
class A {}; // 完整定義
void test() { A a; } // OK
class A;
void test() {
A* p = new A(); // OK,指標大小固定
A& ref = *p; // OK
// 使用完需 delete p
}
// A.h
class A {
public:
A();
void func();
private:
int data;
};
// A.cpp
#include "A.h"
A::A() : data(0) {}
void A::func() {}
// test.cpp
#include "A.h"
void test() { A a; a.func(); }
class A;
void test();
class A {
public:
int x;
A() {}
};
void test() {
A* a = new A();
a->x = 1;
delete a; // 避免洩漏
}
int main() {
test();
return 0;
}
.h 放完整類別定義(含私有成員),實作放 .cpp。std::unique_ptr 管理動態記憶體,避免手動 delete。