錯誤代碼
vector m_node; // 缺少模板參數
vector GetNode(); // 返回值類型不完整
m_node.push_back(node); // node 為 Node*,類型匹配但語法錯誤
正確聲明
#include <vector>
using namespace std;
class Node {
public:
Node() : x(0) {}
void SetX(int v) { x = v; }
int GetX() const { return x; }
private:
int x;
};
class Test {
vector<Node*> m_nodes; // 存指針
public:
void Add(Node* node) { m_nodes.push_back(node); }
const vector<Node*>& GetNodes() const { return m_nodes; } // 返回引用避免拷貝
};
使用示例
int main() {
Test t;
for (int i = 0; i < 10; ++i) {
Node* n = new Node();
n->SetX(i);
t.Add(n);
}
for (Node* n : t.GetNodes()) {
cout << n->GetX() << endl;
}
// 釋放內存
for (Node* n : t.GetNodes()) delete n;
return 0;
}
關鍵點總結
vector<Node*> — 模板參數必須是 Node*。
- 返回
const vector<Node*>& — 引用避免拷貝,const 防止外部修改容器結構。
- 內存所有權:Test 析構時需遍歷釋放,或用
unique_ptr (C++11) 自動管理:vector<unique_ptr<Node>>。
- 遍歷用範圍 for:
for (auto* n : vec) 簡潔安全。
現代 C++ 改寫 (C++11)
class Test {
vector<unique_ptr<Node>> m_nodes;
public:
void Add(unique_ptr<Node> node) { m_nodes.push_back(std::move(node)); }
const vector<unique_ptr<Node>>& GetNodes() const { return m_nodes; }
// 無需手動 delete,Test 析構自動釋放
};