2011-03-16 63 views
1

我有一個類,像這樣:問題,我用C++方法

class Qtree 
{ 
public: 
    Qtree(); 
    Qtree(BMP img, int d); 
private: 
    class QtreeNode 
    { 
    public: 
     QtreeNode* nwChild; // pointer to northwest child 
     QtreeNode* neChild; // pointer to northeast child 
     QtreeNode* swChild; // pointer to southwest child 
     QtreeNode* seChild; // pointer to southeast child 
     RGBApixel element; // the pixel stored as this node's "data" 

     QtreeNode(); 
     QuadtreeNode copy(QuadtreeNode & n); 

    }; 

所以問題是在複製方法。它製作給定節點的副本並將其返回。

QtreeNode Qtree::QtreeNode::copy(QtreeNode & n) { 
    QtreeNode *newNode; 
    //.... 
    return newNode; 
} 

然後我打電話副本從我Qtree的拷貝構造函數:

root=QtreeNode::copy(*tree.root); //each tree has a root pointer 
//have also tried many different things here, but dont really know what to put 

我收到以下錯誤:

error: cannot call member function ‘Qtree::QtreeNode* Qtree::QtreeNode::copy(Qtree::QtreeNode&)’ without object 

and 

error: no matching function for call to ‘copy(Qtree::QtreeNode&)’ 
+0

此外,我意識到我的複製方法返回一個指針,即使它不應該。這只是伴隨着我的整體困惑。我只是不知道如何工作.. – Snowman 2011-03-16 19:00:09

+0

'副本()'沒有聲明爲靜態的。 – 2011-03-16 19:07:53

+0

爲什麼不製作一個合適的拷貝構造函數而不是這個非規範的廢話? – 2011-03-16 19:08:37

回答

2

嘗試:

static QuadtreeNode copy(QuadtreeNode & n); 

或更好地創造複製構造函數。

copy是實例方法,它表示它只能用提供的對象運行。它的內部簽名的功能是:

QuadtreeNode copy(QtreeNode* this, QuadtreeNode & n); 

所以你必須傳遞給參數。使用符號obj->copy(..),但它實際上是通過obj作爲第一個參數。

+0

因此,等我把它變成靜態後,還有什麼我需要做的嗎?我是否也需要遵循第二步?調用我的方法時,我仍然遇到錯誤。如果我有一個方法:'Qtree :: Qtree(Qtree const&tree){root = QtreeNode :: copy(tree.root); }'爲什麼我得到這個錯誤? – Snowman 2011-03-16 19:12:29

+0

@bitmoe你有什麼錯誤? – Andrey 2011-03-16 19:17:02

+0

'錯誤:沒有匹配函數調用'Qtree :: QtreeNode :: copy(Qtree :: QtreeNode * const&)' quadtree.h:71:note:候選項是:static Qtree :: QtreeNode Qtree :: QtreeNode ::複製(Qtree :: QtreeNode)' – Snowman 2011-03-16 19:20:13

1

你需要你的類Qtree :: QtreeNode的一個實例能夠調用它的copy()方法。

你不能做:

root = Qtree::QtreeNode::copy(*tree.root); 

但你可以這麼做:

Qtree::QtreeNode myQtree; 
root = myQtree.copy(*tree.root); 
+0

想知道'(QtreeNode())。copy(* tree.root)'會起作用嗎? – gablin 2011-03-16 19:06:30

+0

@gablin它會,但它是個壞主意。 – Andrey 2011-03-16 19:07:09

+0

它不應該。這樣創建的對象將被立即銷燬。我猜。如果不是......安德烈說......你不應該那樣做。 – 2011-03-16 19:07:38

0
QtreeNode Qtree::QtreeNode::copy(QtreeNode & n) { 
    QtreeNode *newNode; 
    //.... 
    return newNode; 
} 

我可能是錯的,但是你定義的函數爲返回(QtreeNode),然後穿上」你返回一個(QtreeNode *)?

+0

這應該是一個評論。但是,是的,你是對的(問題作者也在這個問題中提到了這個問題)。第一行應該可能讀取'QtreeNode newNode;'。 – gablin 2011-03-16 19:09:08

+0

是的,很抱歉,我正在尋找評論按鈕:顯然,我不能評論低聲譽。在發佈時,我不認爲那個評論也在。 – 2011-03-16 19:30:04