【问题标题】:no matching function to call to "standard constructor"没有匹配的函数来调用“标准构造函数”
【发布时间】:2013-01-22 15:55:00
【问题描述】:

我的 c++ 编译器给出了一个奇怪的响应。我搜索了互联网,但没有找到任何有用或有帮助的...

编译器响应:

floating.hpp|line 29|warning: `class HexFloatingPoint' 具有虚函数但非虚析构函数

在构造函数`HexFloatingPoint::HexFloatingPoint(int, int)'中:

floating.cpp|line 5|error: no matching function for call to `FloatingPoint::FloatingPoint()'

floating.hpp|line 16|注意:候选是:FloatingPoint::FloatingPoint(const FloatingPoint&)

floating.cpp|第 3 行|注:FloatingPoint::FloatingPoint(int, int)

这些是代码文件:

ma​​in.cpp

#include <iostream>
#include "floating.hpp"

using namespace std;

int main(int argc, char* argv[])
{

    return 0;
}

floating.hpp

#ifndef FLOATING
#define FLOATING

#include <string>
#include <vector>

using namespace std;

class FloatingPoint;
class HexFloatingPoint;
class HexDigit;
class HexDigitBool;
class HexDigitChar;

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number);
    virtual void print();
};

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    ~HexFloatingPoint();
};

class HexDigit
{
public:
    virtual void print()=0;
    virtual void set_value(char c);
    virtual int get_value();
};

class HexDigitBool : public HexDigit
{
private:
    bool b[4];
public:
    void print();
    virtual void set_value(char c);
    virtual int get_value();
};

class HexDigitChar : public HexDigit
{
private:
    char c;
public:
    void print();
    virtual void set_value(char c);
    virtual int get_value();
};


#endif

floating.cpp

#include "floating.hpp"

FloatingPoint::FloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}
void HexFloatingPoint::set_significant(string number){}
void HexFloatingPoint::set_exponent(string number){}
void HexFloatingPoint::print(){}
HexFloatingPoint::~HexFloatingPoint(){}

我希望你能帮助我。我已经尝试添加 FloatingPoint();在 floating.hpp 和 floating.cpp 但它没有帮助。

更新 1

将构造函数更改为

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : FloatingPoint(sign_length,exp_length){}

编译器说不...

floating.o||In function `_ZNSt12_Vector_baseIP8HexDigitSaIS1_EED2Ev':|
stl_vector.h:(.text+0x8)||undefined reference to `vtable for FloatingPoint'|
floating.o||In function `_ZN13FloatingPointC1Eii':|
floating.cpp|3|undefined reference to `vtable for FloatingPoint'|'

更新 2

变化

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number);
    virtual void print();
};

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number) = 0;
    virtual void print() = 0;
};

解决了更新1中出现的错误

变化

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    ~HexFloatingPoint();
};

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    virtual ~HexFloatingPoint();
};

已解决的警告

变化

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : FloatingPoint(sign_length,exp_length),significant_length(sign_length),exponent_length(exp_length){}

修复第一个问题

非常感谢大家!!

【问题讨论】:

    标签: c++ class constructor


    【解决方案1】:

    HexFloatingPoint 派生自FloatingPoint,但您不会在HexFloatingPoint 的构造函数的初始化列表中调用FloatingPoint 的任何构造函数。这意味着FloatingPoint 的默认(无参数)构造函数被调用,但类没有定义它,所以你得到了错误。

    要么在HexFloatingPoint的初始化列表中调用FloatingPoint的构造函数,要么给FloatingPoint一个默认构造函数。

    【讨论】:

      【解决方案2】:
      In constructor `HexFloatingPoint::HexFloatingPoint(int, int)':
      
      floating.cpp|line 5|error: no matching function for call to `FloatingPoint::FloatingPoint()'
      
      floating.hpp|line 16|note: candidates are: FloatingPoint::FloatingPoint(const FloatingPoint&)
      
      floating.cpp|line 3|note: FloatingPoint::FloatingPoint(int, int)
      

      一旦你为你的类提供了任何构造函数,如果你的代码调用无参数构造函数,你还必须显式提供一个不带任何参数的构造函数。

      警告清楚地告诉您,您的代码在调用以下构造函数时调用了无参数构造函数:

      HexFloatingPoint(int, int)
      

      所以要么:

      • 您应该显式提供无参数构造函数或
      • 如果您不想为基类提供默认的无参数构造函数,则应使用 member initializer list 并从基类调用所需版本的构造函数.

        floating.hpp|line 29|warning: `class HexFloatingPoint' 具有虚函数但非虚析构函数

      这是一个重要的警告。您的类 HexFloatingPoint 有一个 virtual 成员函数,这意味着它还应该提供一个 virtual 析构函数。
      请注意,如果您没有在基类中提供虚拟析构函数,并且在指向派生类对象的基类指针上调用 delete,那么它将导致未定义的行为。

      【讨论】:

      • 将构造函数更改为 'HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : FloatingPoint(sign_length,exp_length){}' 编译器说不... float.o||在函数_ZNSt12_Vector_baseIP8HexDigitSaIS1_EED2Ev':| stl_vector.h:(.text+0x8)||undefined reference to vtable浮点数'| float.o||在函数_ZN13FloatingPointC1Eii':| floating.cpp|3|undefined reference to vtable 中为FloatingPoint'|'
      • @user2000878:确保为类中的所有virtual 方法提供定义,包括virtual 析构函数。
      • 这就够了吗?虚拟〜HexFloatingPoint();在浮动.hpp
      • @user2000878:这只是一个声明。定义应该是virtual ~HexFloatingPoint(){}
      【解决方案3】:

      floating.hpp|line 29|warning: `class HexFloatingPoint' 有虚拟 函数但非虚析构函数

      为 HexFloatingPoint 添加一个虚拟析构函数:

      virtual ~HexFloatingPoint(); 
      

      一旦类具有虚函数,就需要声明/定义虚析构函数,否则如果通过基类指针或客户端代码中的引用访问派生类,可能会发生派生类没有被调用,行为未定义。通常,对象的派生部分不会被删除(通过基引用或指针访问),在这种情况下,您会留下内存泄漏。查看 Effective C++,第 7 条。

      floating.hpp|line 29|warning: `class HexFloatingPoint' 有虚拟 函数但非虚析构函数

      一旦为类定义了构造函数,默认构造函数 HexFloatingPoint() 不会自动定义,您需要将其显式添加到类声明/定义中。

      【讨论】:

        【解决方案4】:

        首先,错误。 HexFloatingPoint 的构造函数没有初始化基类 FloatingPoint。由于您定义了一个带有两个参数的构造函数,并且没有默认构造函数(不包含参数),因此派生类必须使用您定义的构造函数对其进行初始化:

        HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) :
            FloatingPoint(sign_length, exp_length),  // ADD THIS
            significant_length(sign_length),
            exponent_length(exp_length)
        {}
        

        或者,您可能希望不初始化基类成员,或者将它们初始化为默认值,在这种情况下,您需要提供默认构造函数:

        FloatingPoint() {} // or initialise the members if you want
        

        但这可能不是您想要做的;您可能希望正确初始化它们。

        其次,警告。通常,当您拥有多态基类时,您会希望通过指向基类的指针来删除派生对象。仅当基类声明了虚拟析构函数时才允许这样做;否则,这种删除会产生未定义的行为。我建议你按照编译器的建议添加一个:

        virtual ~FloatingPoint() {}
        

        最后,一旦您修复了编译器错误(假设没有比您发布的代码更多的代码),由于缺少FloatingPoint::set_exponentFloatingPoint::print 的定义,您将收到链接器错误。这是因为您已将它们声明为虚拟但不纯,并且尚未实现它们。他们可能想要像set_significant 一样纯虚拟:

        virtual void set_exponent(string number) = 0;
                                                 ^^^
        

        【讨论】:

          猜你喜欢
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-31
          • 2012-05-09
          • 2020-01-22
          • 1970-01-01
          • 2020-06-09
          相关资源
          最近更新 更多