我可以使用成员元素作为类方法的默认参数吗?

时间:2013-08-23 14:47:45

标签: c++

方法Minimum返回二叉搜索树中的最小元素。如果没有传递参数,则打印最小的调用对象。如果传递了节点的地址,则打印其根为节点

的子树的最小值

编译时显示“无效使用非静态数据成员Tree::root

#include<stdlib.h>
#include<iostream>
class Node
{
public:
    Node *leftchild;
    Node *rightchild;
    Node *parent;
    int info;
};

class Tree
{
public:
    Node *root;
    Tree()
    {
        root=NULL;
    }
    void Minimum(Node*);
};

void Tree::Minimum(Node *curnode=root)
{
    Node *parent;
    while(curnode!=NULL)
    {
        parent=curnode;
        curnode=curnode->leftchild;
    }
    std::cout<<parent->info<<endl;
}

int main()
{
    Tree tree;
    tree.Minimum();
    return 0;
}

4 个答案:

答案 0 :(得分:3)

不,你不能。

对于默认值,您可以使用值,变量或在函数定义的上下文中可访问的函数,即在类定义中,它在任何特定的范围之外对象的上下文。

它通常可以帮助我思考编译器如何真正处理它。特别是,当编译器对函数执行重载解析并发现具有比调用位置处使用的参数多的参数的重载时,编译器将在调用位置生成代码以填充其余参数。生成的代码将始终使用所有参数生成一个调用:

int g();
void f(int x = g()); 
int main() {
    f();               // [1]
}

当编译器处理[1]并且它执行重载解析时,它发现void ::f(int x = g())是最佳候选者并且选择它。然后填充默认参数并为您生成调用:

int main() {
    f( /*compiler injected*/g() );
}

如果你考虑调用成员函数或类的成员变量,它在调用者的上下文中是没有意义的(可以改变语言以适应这种情况,处理它是不可能的) ,但使用当前的模型它不起作用。)

答案 1 :(得分:2)

您也可以将其设置为NULL,例如默认设置,然后检查并将其设置为方法中的成员。

或者使用void Minimum();重载方法,并在该方法中调用带有成员参数的方法。

void Tree::Minimum() {
    Minimum(root);
}

答案 2 :(得分:1)

我找不到任何方法让默认参数像那样工作。但是你可以通过重载函数获得相同的结果,如下所示:

class Tree
{
public:
    Node *root;
    Tree()
    {
        root=NULL;
    }
    void Minimum(Node*);
    void Minimum();
};

void Tree::Minimum(Node *curnode)
{
    Node *parent;
    while(curnode!=NULL)
    {
        parent=curnode;
        curnode=curnode->leftchild;
    }
    std::cout<<parent->info<<std::endl;
}

void Tree::Minimum()
{
    Minimum(root);
}

答案 3 :(得分:0)

如果显式传递NULL参数的情况不需要与传递的参数区分开来,您可以将NULL设置为默认值并使用root if curnodeNULL

void Tree::Minimum(Node *curnode=NULL)
{
    if (curnode==NULL)
        curnode = root;
    Node *parent;
    while(curnode!=NULL)
    {
        parent=curnode;
        curnode=curnode->leftchild;
    }
    std::cout<<parent->info<<endl;
}