2014-06-18 66 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