Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象类和虚拟方法问题:“;无法分配抽象类型的对象";_C++_Abstract Class_Abstract - Fatal编程技术网

C++ 抽象类和虚拟方法问题:“;无法分配抽象类型的对象";

C++ 抽象类和虚拟方法问题:“;无法分配抽象类型的对象";,c++,abstract-class,abstract,C++,Abstract Class,Abstract,我有以下课程: class IDescriptor { public: virtual float compare(IDescriptor *D) = 0; }; class DescHistogram : public IDescriptor { public: vector<float> desc; DescHistogram(vector<float> vd); ~DescHistogram(); float compa

我有以下课程:

class IDescriptor
{
public:

    virtual float compare(IDescriptor *D) = 0;
};

class DescHistogram : public IDescriptor
{
public:

    vector<float> desc;
    DescHistogram(vector<float> vd);
    ~DescHistogram();
    float compare(DescHistogram *D);
    // ALL THESE FUNCTIONS ARE IMPLEMENTED IN THE SOURCE CPP FILE.
};
我对此有一些疑问:

这个错误的原因是什么?
DescHistogram::compare
的参数必须是什么类型?我知道它可以是派生类型,不是吗? 抽象类需要构造函数
IDescriptor


也许这是一个愚蠢的错误,但我没有找到任何解决方案。提前感谢您的帮助

您需要在DescHistogram中定义compare函数

基于您在此处编写的内容,您可以为
DescHistogram
定义
compare
的实现(并且不将其标记为纯
虚拟

这个错误的原因是什么

DescHistogram
不会用兼容函数重写
IDescriptor::compare
,因此它仍然是抽象的,无法实例化

DescHistogram::compare
的参数必须是什么类型

IDescriptor
,以匹配其覆盖的功能。它必须可以被基类函数接受的任何类型调用,因此不能是更派生的类型

我知道它可以是派生类型,不是吗

不,必须是同一类型

抽象类需要构造函数
IDescriptor


不需要。它已经有一个隐式默认构造函数,并且不需要其他任何东西作为非抽象派生类的一部分进行实例化。

没有在
DescHistogram
中实现
virtual compare()
函数。您实现了另一个
compare()
函数:

virtual float compare(IDescriptor *D) = 0; // in class IDescriptor
        float compare(DescHistogram *D);   // in class DescHistogram
另一个
compare()
函数没有实现基本的
virtual
函数,因此
DescHistogram
仍然是抽象的

如果对从
IDescriptor
派生的不同类型(例如
DescHistogram
)进行比较没有意义,那么您的代码设计就是有缺陷的。您仍然可以使用RTTI,即通过

class DescHistogram : public IDescriptor
{
  float compare_self(DescHistogram *D); // tolerates nullptr input
public:
  float compare(IDescriptor *D)
  {
    return compare_self(dynamic_cast<DescHistogram*>(D));
  }
};
类描述直方图:公共IDescriptor
{
float compare_self(DescHistogram*D);//允许nullptr输入
公众:
浮点比较(IDescriptor*D)
{
返回compare_self(dynamic_cast(D));
}
};

但这可能是低效的。此外,
compare\u self
没有合理的独立用途(由于设计缺陷)。

已经定义并实现了比较功能(在cpp文件中)。我不明白你在说什么。抱歉:p压缩功能在我的cpp文件中实现。也许我应该在我的问题中指定它。@froure如果你在某个地方的.cpp文件中有一个实现,我建议将它添加到问题中。某些原因导致编译器找不到该实现OK,我现在了解到DescHistogram中的compare函数必须有一个IDescriptor作为参数。但是,现在,在我的DescHistogram实现中,我必须使用vector desc。在这种情况下,编译器不接受这一点,因为desc不是IDescriptor的一部分。我必须做什么?@froure:Dynamic将
IDescriptor*
转换为比较方法中的
DescHistogram*
。好的,它可以工作了!非常感谢你!!!我学到了更多关于抽象的东西!Thaaanks!:D
virtual float compare(IDescriptor *D) = 0; // in class IDescriptor
        float compare(DescHistogram *D);   // in class DescHistogram
class DescHistogram : public IDescriptor
{
  float compare_self(DescHistogram *D); // tolerates nullptr input
public:
  float compare(IDescriptor *D)
  {
    return compare_self(dynamic_cast<DescHistogram*>(D));
  }
};