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_值);
thenvoid Tree::Minimum(Node*curnode){…}
),这样就可以在没有参数的情况下调用它。默认值可以是函数调用,并且在调用函数的每个位置对其求值?我一直认为它必须是一个常量!@jcoder:它可以是一些东西……它可以是一个函数,并且在需要默认参数时使用它(如果所有调用都提供参数,则永远不会),它可以是一个具有静态存储持续时间的变量,也可以是一个通过用户转换生成不同类型的表达式,每次调用都会对转换进行求值(需要默认值)…嗯,我今天学到了一些东西!
int main() {
f( /*compiler injected*/g() );
}