2014-06-18 63 views
4

爲什麼犯規C++允許這

傳遞一個變量函數的C++默認參數

void insertData (T data1,Tree<T> *tree=TreeTop); 

傳遞一個值作爲默認的參數被允許,但爲什麼不是一個變量作爲默認paramaeter ....? ?

class BinaryTree 
{ 
    private : 

    Tree<T> *TreeTop; 
    unsigned int numberOfElements; 

    public : 
      void insertData (T data1,Tree<T> *tree=TreeTop); 
      // Only Prototype For Question Purpose 
    } 
+0

是的同樣的懷疑.. !! Dint查找搜索.. – PRP

回答

0

你可以做這樣的重載:

void insertData(T data1) { 
    insertData(data1, TreeTop); 
} 

void insertData(T data1, Tree<T> *tree) { 
    // Code 
} 
+0

是的,我做了同樣的事情......只是想知道編譯器面臨怎樣的技術困難來通過一個變量作爲默認參數... – PRP

0

如果你讓樹頂靜態這將工作:

class BinaryTree 
{ 
    private : 

    static Tree<T> *TreeTop; 
    unsigned int numberOfElements; 

    public : 
      void insertData (T data1,Tree<T> *tree=TreeTop); 

} 

在這種情況下,這將是一個類級別的默認爲「insertData」方法調用。如果你想要一個實例級默認情況下,你將不得不做,而不是像

class BinaryTree 
{ 
    private : 

    Tree<T> *TreeTop; 
    unsigned int numberOfElements; 

    public : 
      void insertData (T data1,Tree<T> *tree=NULL); 

} 

然後,在您的實現,做

public void BinaryTree::insertData(T data1, Tree<T> *tree) 
{ 
    if (tree==null) tree=TreeTop; 
    ... 
} 
+0

你的意思是'nullptr'(或'NULL' for C++ 03)而不是'null'。 – Jarod42

+0

它假定'nullptr'不是*有效的*輸入。 – Jarod42

+0

@ Jarod42 - 是的,我已經修正了大腦上的C#。第二點也正確 - 假設null不是有效的輸入。如果null是有效的,那麼之前的海報的超載方法就會得到它。 – T3am5hark