2013-01-22 109 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

相關問題