2012-08-07 100 views
1

在此處構建我的問題:C++ cannot establish handle reference to 'parent' object -- circular includes or undefined type errors我想創建一個類(稱爲Node),該類具有兩個泛型類型成員,一個指向待確定類型類型父對象的泛型指針以及一組通用指針的向量,指向一組待定類型的子對象的元素。在雙向樹結構中存在的對象將從Node繼承,並且可以在數據可用時填充其父成員和子成員。以下是我迄今爲止爲此對Node.h:在類中使用泛型類成員

#include <vector> 

#ifndef NODE_H_ 
#define NODE_H_ 

template<typename T> class parent{}; 
template<typename T2> class child{}; 
class Node{ 

private: 
parent<T>* parent_ptr; 
vector<child<T2>>* children_ptr; 

public: 
//some accessor methods will go here to get and set the parent and children 
}; 
#endif /*NODE_H_*/ 

顯然這不是要在C++模板,因爲我得到錯誤C2065以正確的方式「‘T’是一個未聲明的標識符」和C4430「缺少類型說明符 - int假定」錯誤。我在這裏找到了一些關於創建模板類和函數的有用文檔:http://www.cprogramming.com/tutorial/templates.html,但是這個教程和我能找到的任何其他文檔都沒有涉及使用模板在非模板類中聲明泛型類成員;我相當肯定這個(或類似的東西)是我需要爲我的用例做的事情,那麼在標準C++類中聲明和使用通用成員變量的正確方法是什麼?

+3

你似乎完全不關心C++。我建議在處理模板之前先掌握基本語言。在這裏,你可能應該首先寫一些特定的類型,然後使其通用。 – pmr 2012-08-07 16:46:45

回答

3

你絕對應該花一些時間瞭解模板如何工作,並從簡單的事情開始。我花了幾年的時間才能夠創建複雜的模板對象,而無需進行大量的編譯器錯誤調試,甚至更長的時間如何設計能夠最大限度地降低複雜性的代碼結構。

但這是我認爲你的意圖。您的模板中有太多信息,只需將類型名稱刪除到Parent和Child(如果需要,也可以使用T和T2) - 儘管這些名稱很混亂)。

#include <vector> 

#ifndef NODE_H_ 
#define NODE_H_ 

template<typename Parent, typename Child> 
class Node{ 

private: 
Parent* parent_ptr; 
std::vector<Child*> children_ptr; 

public: 
//some accessor methods will go here to get and set the parent and children 
}; 
#endif /*NODE_H_*/ 

另外,作爲一個側面說明,你可能需要一個父所有權的情況下,如果父母擁​​有自己的孩子和他們的自由內存的時候,他們是完成(如果每個孩子正好由1母公司持有)。在這種情況下,向量將變爲:

vector<Child> children; 

否則,您需要爲如何刪除樹創建一個很好的結構。另一種方法是使用智能指針,一旦它們未被使用就會刪除它們(對於難以追蹤的抽象結構很有用)。請參閱Boost Smart Pointers或來自C++後期修訂版的等價物,但它們需要特別注意循環引用。

+0

很酷,謝謝。對於Google員工:還值得注意的是,我遺漏了std命名空間的向量;如果沒有'使用名稱空間標準'或指定'std :: vector',上面的代碼將無法編譯。請參閱下面的@ pmr的答案,以便正確使用 – CCJ 2012-08-07 18:46:44

+0

@CCJ很高興它有幫助。爲了正確,我將std :: vector添加到了答案中。 – Pyrce 2012-08-07 21:39:49

1

我沒有看到你需要什麼parentnode除了將 附加信息添加到你已經包含的數據。這是一個 鏈接列表中的典型情況,您需要注入一個nextprev指針來維護結構。

當你已經處理球,這似乎是沒有必要的:

template<typename Parent, typename Child> 
class Node { 
    Parent* parent; 
    std::vector<Child*> children; 
}; 

對我來說,這仍然是一個可怕的很多指針並沒有對象 管理呢。

1

您的代碼應該這樣寫:

template<typename Parent, typename Child> 
class Node 
{ 
private: 
    Parent* parent_ptr; 
    vector<Child>* children_ptr; 

public: 
    //some accessor methods will go here to get and set the parent and children 
}; 

你有它的方式,只有(空)parent類有T模板參數,只有(空)child類有T2模板參數。

另外,我不認爲你真的想要一個指向vector的指針。這是可能的,但這是一個非常奇怪的用法。

不過說真的,我相信這會令很多更有意義,簡單地使用繼承此:

class Node 
{ 
private: 
    Node* parent_ptr; // a pointer to a Node, or any Node-derived object 
    vector<Node*>* children_ptr; // a vector of pointers to Nodes or Node-derived objects 

public: 
    //some accessor methods will go here to get and set the parent and children 
}; 

指針的vector是煩了,雖然。我可能會將我的vector包裝在一個處理內部內存分配的類中,或者查找一些C++ 11 STL智能指針類。