在C++函数中将变量作为默认参数传递

3
为什么C++不允许这样做?
void insertData (T data1,Tree<T> *tree=TreeTop);

将一个值作为默认参数传递是允许的,但为什么不允许将一个变量作为默认参数呢?
class BinaryTree
{
    private :

    Tree<T> *TreeTop;
    unsigned int numberOfElements;

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

是的,同样的疑问..!! 搜索时没有找到.. - Rohith R
2个回答

1
你可以这样制作一个重载:

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

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

是的,我也是这样做的...只是想知道编译器在将变量作为默认参数传递时会遇到什么技术困难... - Rohith R

0
如果你将TreeTop设置为静态的,这个方法就可以正常工作:
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;
    ...
}

你应该使用nullptr(或者在C++03中使用NULL),而不是null - Jarod42
它假设nullptr不是有效的输入。 - Jarod42
@Jarod42 - 是的,我脑海中有C# ~ 已更正。第二点也正确 - 假设null不是有效输入。如果null是有效的,则前一个帖子的重载方法将得到它。 - T3am5hark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接