1

次のようなコードがあります。

class A{  // declaration is simplified
 virtual void FNC1();
};
bool compare(S s1,S s2){
    return  s1<s2; 
}
void A::FNC1(){
  iterator it;
  sort(it.begin(),it.end(),compare);
}

class B : public A{
 virtual void FNC1();
};
void B:FNC1(){
  iterator it;
  // do something different

  sort(it.begin(),it.end(),compare);
}

そこで、クラス B を使用してクラス A を継承し、関数 FNC1() をオーバーライドしましたが、問題は、std::sort() 関数のように、3 番目の変数は実際には関数である必要があり、そのような関数は常に直接宣言されています。コピーと貼り付けを避けて、Bにこの関数を直接継承させるにはどうすればよいか本当に知りたいです。compare() 関数を A のメンバー関数として配置しようとしましたが、コンパイルされません: sort(it.begin(), it.end(), this->compare);

比較関数を別のヘッダー ファイルにインクルードしようとすると、宣言できないと表示されます。Bにこの関数を正しく継承させるにはどうすればよいですか? 実際には、A のコードを再利用する必要がある 3 つのクラスがあり、比較関数は実際には複雑なものです。

4

4 に答える 4

2

あなたの問題は、関数compareがヘッダーで定義されていることです。つまり、署名に加えてそこに本体があります。ヘッダーを 2 か所に含めると、コンパイラは複数の定義について警告します。宣言はヘッダーに、定義は .cpp ファイルにのみ含める必要があります。

これは A のヘッダーに入る必要があります。それを呼び出しましょうa.h

bool compare(S s1,S s2);

これは入るはずですa.cpp

bool compare(S s1,S s2){
    return  s1<s2; 
}

ところで、用語を明確にするために、非メンバー関数を継承することはできません。宣言を含めてオブジェクト ファイルにリンクする限り、任意の非メンバー関数をどこでも使用できます。

于 2012-11-28T02:34:52.407 に答える
1

あなたは正しい軌道に乗っています。関数を単純に再利用できcompareます。変更したり、「継承」したりする必要はありません。

以下は、エラーなしでコンパイルおよび実行されるはずです。

#include <algorithm>
#include <vector>

struct S { int i; };

class A{  // declaration is simplified
public:
 virtual void FNC1();
};
bool compare(const S& s1,const S& s2){
    return  s1.i < s2.i;
}

void A::FNC1(){
  std::vector<S> v;
  std::sort(v.begin(),v.end(),compare);
}

class B : public A{
public:
 virtual void FNC1();
};
void B::FNC1(){
  std::vector<S> v;
  // do something different

  std::sort(v.begin(),v.end(),compare);
}

int main () { A a; B b; a.FNC1(); b.FNC1(); }
于 2012-11-28T02:35:55.533 に答える
1

比較関数staticを独立型にするのではなく、基本クラスのメンバー関数にすることができます。

class A{  // declaration is simplified
    virtual void FNC1();
public:
    static bool compare(const A& s1, const A& s2) {
        return ...; // The logic behind your compare function goes here
    }
};

次のような関数を使用できます。

sort(it.begin(), it.end(), A::compare);
于 2012-11-28T02:26:55.357 に答える
0

A のメンバーを比較するとコンパイルされない理由は、おそらく公開または保護されていないためです。デフォルトでは、クラスのメンバーはプライベートであり、プライベート メンバーは派生クラスからは見えません。

必要なもの:

class A{  // declaration is simplified
{
    virtual void FNC1();

    protected:
        bool compare( S s1, S s2 ){...}
};
于 2012-11-28T02:32:27.947 に答える