2017-01-28 4 views
2

のデフォルト値として、私は次のようメンバプロパティメソッド

#ifndef BINARY_SEARCH_TREE_H 
#define BINARY_SEARCH_TREE_H 

struct Node 
{ 
    int data; 
    Node *left, *right; 
    Node(int data); 
}; 

class BinarySearchTree 
{ 
    Node *head; 
public: 
    BinarySearchTree(); 
    void insert(int data); 
    void inorder(Node *cur = head); 
}; 

#endif 

のように見えるヘッダファイルをしましたし、それは

In file included from Binary_Search_Tree.cpp:2:0: 
Binary_Search_Tree.h:17:28: error: invalid use of non-static data member ‘BinarySearchTree::head’ 
    void inorder(Node *cur = head); 
          ^
Binary_Search_Tree.h:13:9: note: declared here 
    Node *head; 

注意を言う:私は、デフォルト値を提供していませんでした定義しながら、メソッド。私はそれが必要ではないと思う。

デフォルト値には静的または定数値のみが使用できますか?はいの場合はなぜですか? 他に何か間違っていますか?

+0

Fyi、少なくともあなたが求める*振る舞いは、 'void inorder(){inorder(head);}の追加オーバーロードで簡単に実行できます。 }; ' – WhozCraig

+0

これはできます。それでは、C++のデフォルト値の有用性は何ですか? pythonはオーバーロードをサポートしておらず、上記の場合は、デフォルト値を使用する2つのメソッドではなく、1つのメソッドでのみ行うことができます。 – Abhisek

答えて

2

あなたが探している動作は、C++では実行できません。デフォルト値は「やや一定」でなければなりません。それは実際の定数、または静的フィールドなどを意味します。デフォルトの引数ではなく、許可されているものに関する詳細hereがあります。この問題を解決するために


一つの方法は、ちょうどheadで始まる1引数の関数を呼び出す引数なしのオーバーロードを持つことです。 もう1つは、デフォルトの引数としてnullを使用し、指定されている場合にはそれをheadに置き換えることです。ただし、nullリーフノードに到達すると、これが壊れる可能性があります。

2

標準(ドラフト)からの引用:それはクラスのメンバアクセス式([expr.refのID-表現として表示されない限り、非静的メンバは、デフォルトの引数には表示されないものと

])または注


([expr.unary.op])は、それがメンバへのポインタを形成するために使用されていない限り:メソッドを定義しながら、私はデフォルト値を提供していませんでした。私はそれが必要ではないと思う。

(以前に宣言された関数の定義である)再宣言では、デフォルトの引数を再定義することさえできません。

デフォルト値では静的または定数値のみが使用できますか?

もあります。数値も同じではありません。しかし、多くの例外があり、メンバーは例外に含まれています。


オーバーロードを使用してこの制限を回避することができます。

+0

あなたはどちらが許可されていて、どれが許可されていないかについてのリンクを提供できますか? – Abhisek

+0

@Abhisek http://eel.is/c++draft/dcl.fct.default – user2079303