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默认参数)

  • …类似地,非静态成员不得在默认参数中使用,即使未对其求值,除非它显示为 类成员访问表达式(5.2.5)的id表达式或 用于形成指向成员(5.3.1)的指针。[举例:政府 以下示例中的X::mem1()声明格式不正确 因为没有为用作 初始值设定项
  • 您可以重载函数
    添加

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