2013-01-22 67 views
3

我从我的C++编译器得到一个奇怪的响应。我在网上搜索,但什么也没有有用或有益想出了......没有匹配函数调用“标准构造函数”

编译器响应:

floating.hpp|line 29|warning: `class HexFloatingPoint' has virtual functions but non-virtual destructor

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)

这些代码文件:

的main.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){} 

固定的第一个问题

非常感谢球员!

回答

1
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 | 29行|警告:`类HexFloatingPoint”有虚函数,但非虚析构函数

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

+0

更改构造器 'HexFloatingPoint :: HexFloatingPoint(INT sign_length,INT exp_length):浮点(sign_length,exp_length){}' 编译说没有.. 。 floating.o ||在函数中'_ZNSt12_Vector_baseIP8HexDigitSaIS1_EED2Ev':| stl_vector.h :(。text + 0x8)||未定义的引用'vtable for FloatingPoint'| floating.o ||在函数中'_ZN13FloatingPointC1Eii':| floating.cpp | 3 |未定义的引用'vtable for FloatingPoint'|' – user2000878

+0

@ user2000878:确保为类中的所有'virtual'方法提供了定义,包括'virtual'析构函数。 –

+0

这够了吗? virtual〜HexFloatingPoint();在floating.hpp – user2000878

1

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

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

0

floating.hpp|line 29|warning: `class HexFloatingPoint' has virtual functions but non-virtual destructor

虚析构函数添加到HexFloatingPoint:

virtual ~HexFloatingPoint(); 

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

floating.hpp|line 29|warning: `class HexFloatingPoint' has virtual functions but non-virtual destructor

,你定义一个类的构造函数,默认的构造函数HexFloatingPoint()不会自动定义,你需要明确地将它添加到类声明/定义。

0

首先,错误。 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; 
             ^^^ 
+0

谢谢你这有助于解决更新的错误 – user2000878

相关问题