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

C++ 我可以使用成员元素作为类的方法的默认参数吗?,c++,C++,方法Minimum返回二进制搜索树中的最小元素。如果未传递任何参数,则打印调用对象的最小值。如果传递了节点的地址,它将打印根为节点的子树的最小值 编译时,它显示“非静态数据成员的无效使用树::根” #包括 #包括 类节点 { 公众: 节点*leftchild; 节点*右子节点; 节点*父节点; 国际信息; }; 类树 { 公众: 节点*根; 树() { root=NULL; } 最小空隙率(节点*); }; 无效树::最小值(节点*curnode=root) { 节点*父节点; while(cu

方法
Minimum
返回二进制搜索树中的最小元素。如果未传递任何参数,则打印调用对象的最小值。如果传递了节点的地址,它将打印根为节点的子树的最小值

编译时,它显示“非静态数据成员的无效使用
树::根

#包括
#包括
类节点
{
公众:
节点*leftchild;
节点*右子节点;
节点*父节点;
国际信息;
};
类树
{
公众:
节点*根;
树()
{
root=NULL;
}
最小空隙率(节点*);
};
无效树::最小值(节点*curnode=root)
{
节点*父节点;
while(curnode!=NULL)
{
父节点=curnode;
curnode=curnode->leftchild;
}

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

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);
}
类树
{
公众:
节点*根;
树()
{
root=NULL;
}
最小空隙率(节点*);
无效最小值();
};
无效树::最小值(节点*curnode)
{
节点*父节点;
while(curnode!=NULL)
{
父节点=curnode;
curnode=curnode->leftchild;
}

std::cout您也可以将其设置为
NULL
作为默认值,然后检查并将其设置为方法中的成员

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

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

如果显式传递
NULL
参数的情况不需要与未传递的参数区分,则可以将
NULL
设置为默认值,并在
curnode
NULL
时使用
root

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;
}
void Tree::Minimum(Node*curnode=NULL)
{
if(curnode==NULL)
curnode=根;
节点*父节点;
while(curnode!=NULL)
{
父节点=curnode;
curnode=curnode->leftchild;
}
不,你不能

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

它通常帮助我思考编译器是如何处理这个问题的。特别是,当编译器对函数执行重载解析时,发现重载的参数比调用位置使用的参数多,编译器将在调用位置生成代码以填充其余参数。生成的代码将方法生成包含所有参数的调用:

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

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

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

请注意,您的最小实现具有未定义的行为,参数为NULL。这不是答案,但您应该在声明中提供默认参数,而不是定义(即
void Minimum(Node*=default_值);
then
void Tree::Minimum(Node*curnode){…}
),这样就可以在没有参数的情况下调用它。默认值可以是函数调用,并且在调用函数的每个位置对其求值?我一直认为它必须是一个常量!@jcoder:它可以是一些东西……它可以是一个函数,并且在需要默认参数时使用它(如果所有调用都提供参数,则永远不会),它可以是一个具有静态存储持续时间的变量,也可以是一个通过用户转换生成不同类型的表达式,每次调用都会对转换进行求值(需要默认值)…嗯,我今天学到了一些东西!
int main() {
    f( /*compiler injected*/g() );
}