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()函数中,第三个变量应该是一个函数,而这样的函数总是直接声明的。我真的很想知道如何避免复制和粘贴并使B直接继承此功能。我试图将 compare() 函数作为 A 的成员函数,它不会编译:sort(it.begin(), it.end(), this->compare);

我试图将比较函数包含到一个单独的头文件中,它说我不能声明它。我怎样才能正确地让 B 继承这个函数?因为,实际上,我有 3 个类都需要重用 A 的代码,而比较函数确实是一个复杂的函数。

4

4 回答 4

2

您的问题是该函数compare是在标头中定义的,这意味着除了其签名之外,您还有它的主体。如果你在两个地方包含头文件,编译器会报错多个定义。您应该只在标头中有声明,在 .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

您可以使比较函数成为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 回答
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 回答
0

如果您比较 A 的成员,它不会编译的原因可能是您没有将其公开或保护。默认情况下,类的成员是私有的,派生类看不到私有成员。

你需要:

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

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