0

クラスメンバーを呼び出して、同じクラスの別のメンバー関数のデフォルトパラメーターを取得しようとしています。これが私がやっていることです:

class y {
    virtual vector<int> getLabels();
}

class x: public y {
    virtual vector<int> getLabels();
    listGraph getPlanarGraph(const vector<int> &nodeSe=getLabels());    //want to achieve this. Compiler won't agree 
};

何も提供されていない場合、つまりobj.getPlanarGraph()whereobjが対応するタイプとして呼び出されている場合は、 graph. 次のような簡単なラッパーを作成できることはわかっていますが(最後を参照)、それが許可されていない理由にもっと興味があります。上記の宣言のコンパイル エラーは次のとおりcannot call member function ‘virtual std::vector<int> baseGraph::getLabels() const’ without objectです。

this引数を指定すると、エラーは‘this’ may not be used in this context.

class x: public y {
    virtual vector<int> getLabels();
    listGraph getPlanarGraph(const vector<int> &nodeSe=this->getLabels());    //error here.
};

私が考える回避策は次のとおりです。

class x: public y {
    virtual vector<int> getLabels();
    listGraph getPlanarGraph(const vector<int> &nodeSet);    //No. 2
    listGraph getPlanarGraph();    //define the function accordingly and call a 'No. 2' from inside.   
};
4

1 に答える 1

0
listGraph getPlanarGraph(const vector<int> &nodeSe=this->getLabels());    

...メソッドが呼び出されているときに、メソッドがthis属するクラスのインスタンスではなく、メソッドを呼び出しているクラスインスタンスを参照するため、不可能です。thisメソッドが実行されると、メソッドが属するクラスのインスタンスのみを参照します。

それが不可能な理由については、上記の行は、次のようなメソッドの呼び出しに多少似ています。

x xinstance;
const vector<int> nodeSe labels = this->getLabels();
listGraph lg = xinstance.getPlanarGraph(labels);   

thisこのコードは機能しますが、 がではなく、上記のコード行を含むクラスのインスタンスを参照していることは明らかですxinstance。@Ivan Aucamp がコメントで指摘したように、ただし、メンバー関数宣言で表現されている場合this、その時点で定義されていないため、何も参照しません。

于 2013-07-16T20:59:33.233 に答える