C++ c++;默认参数类成员
代码没有编译。。。 我得到以下错误C++ c++;默认参数类成员,c++,class,parameters,default,members,C++,Class,Parameters,Default,Members,代码没有编译。。。 我得到以下错误 class bst { private: typedef struct nod { int data; nod* left; nod* right; nod(int key):data(key),left(NULL),right(NULL){} }node; node* root; public: void create(); void add(int key,node*curr=root); void c2ll(); void pri
class bst
{
private:
typedef struct nod
{
int data;
nod* left;
nod* right;
nod(int key):data(key),left(NULL),right(NULL){}
}node;
node* root;
public:
void create();
void add(int key,node*curr=root);
void c2ll();
void print(){}
欢迎您提出任何建议……我试图避免编写包装器方法,而是使用c++提供的默认功能使用如下:
const node*root=NULL;
void add(int键,节点*curr=root);
您可以在此处查看实际运行的示例:
< P>根据C++标准(83.6默认参数)
添加
int b;
class X {
int a;
int mem1(int i = a); // error: non-static member a
// used as default argument
int mem2(int i = b); // OK; use X::b
static int b;
};
默认情况下,第一个函数将使用root
。它可以简单地调用第二个函数,将节点根作为第二个参数传递。问题在于该方法的定义:
void add( int key );
void add( int key, node *curr );
root
未在您使用它的上下文中定义。如果您指的是成员变量node*root
,则无法在成员函数中默认为成员变量,但可以将NULL(0)设置为默认值,并在定义中选中它
void add(int key,node*curr=root);
有两种方法
使用“魔术”默认值:
或者完全放弃默认设置并使用重载:
void add(int key, node* curr = NULL)
{
if (curr == NULL)
curr = root;
// ...
}
我个人的偏好是后者,但你根本不应该在树的界面中公开节点类型,因为这会让树的用户破坏它的平衡。因为错误表明你不能将默认参数设置为非静态成员变量。你应该重载add以只取键,并调用带两个参数的键root作为第二个参数。@Borgleader:你应该回答这个问题。那么,这就相当于写一个包装函数。我是否可以不写这个包装函数而逃之夭夭?就参数和成员变量的相互关系达成一致…很好的例子我遇到的问题是它是一个递归函数…void add(int key)我需要evry堆栈帧中的节点*,因此我将其设置为parameter@basav正如我在更新后的帖子中所写,第一个函数可以调用第二个递归函数。:)因此没有问题。@basav通常这种方法用于递归函数void reverse(char*s)。函数本身不是递归的,但它调用重载函数void reverse(char*s,size_t n)像reverse(s,strlen(s));嗯,如果根节点是const,则最终不可能在根节点的左侧或右侧添加另一个节点。。。
void bst::add ( int key,node*curr=NULL)
{
if(curr==NULL) {
curr= this->root;
}
}
void add(int key, node* curr = NULL)
{
if (curr == NULL)
curr = root;
// ...
}
void add(int key, node* curr)
{
// ...
}
void add(int key)
{
add(key, root);
}