c++ 默认参数 class 成员

c++ default parameters class 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 print(){}

代码无法编译... 我收到以下错误。

ain.cpp: In function ‘int main()’:
main.cpp:7:12: error: call to ‘void bst::add(int, bst::node*)’ uses the default argument for parameter 2, which is not yet defined
   bt.add(50);
            ^
In file included from bst.cpp:1:0:
bst.h:14:8: error: invalid use of non-static data member ‘bst::root’
  node* root;
        ^
bst.h:19:28: error: from this location
 void add(int key,node*curr=root);
                            ^
bst.h:14:8: error: invalid use of non-static data member ‘bst::root’
  node* root;
        ^
bst.cpp:10:34: error: from this location
 void bst::add(int key,node* curr=root)

欢迎提出任何建议...我试图避免编写包装方法,而是使用 c++

提供的默认功能

这样使用: const node* root = NULL; void add(int key,node*curr=root);

您可以在此处查看实际的 运行 示例: http://ideone.com/tJ1r29

根据 C++ 标准(8.3.6 默认参数)

  1. ...Similarly, a non-static member shall not be used in a default argument, even if it is not evaluated, unless it appears as the id-expression of a class member access expression (5.2.5) or unless it is used to form a pointer to member (5.3.1). [ Example: the declaration of X::mem1() in the following example is ill-formed because no object is supplied for the non-static member X::a used as an initializer.
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;
};

您可以重载函数 add。例如

void add( int key );

void add( int key, node *curr );

第一个函数默认使用 root。它可以简单地调用第二个函数作为第二个参数传递节点根。

问题出在方法的定义中:

void add(int key,node*curr=root);

root 未在您使用它的上下文中定义。如果你指的是成员变量node* root,在成员函数中没有办法默认为成员变量,但你可以设置NULL(0)为默认值,并在定义中检查它。

void bst::add ( int key,node*curr=NULL)
{
     if(curr==NULL) {
         curr= this->root;
     }
}

有两种方法。

要么使用 "magic" 默认值:

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);
}

我个人更喜欢后者,但你根本不应该在树的界面中公开节点类型,因为这会让树的用户破坏它的平衡。