2013-06-28 39 views
-3

下面的程序只是爲了試驗繼承,下面的代碼工作得很好......直到我在繼承類「pochodna」的複製構造函數中添加「const」而不改變任何東西。這使得以下列方式更改代碼(OFC,變化也已經在頭文件中完成):複製「const」構造函數 - 鏈接器錯誤?

pochodna::pochodna(const pochodna & wzor): podstawowa(wzor) { 
    this->x=wzor.x; 
    this->y=wzor.y; 
} 

編譯器顯示更改後出現以下錯誤:

[Linker error] undefined reference to pochodna::pochodna(pochodna&)

發生同樣的情況,當我 「常量」 添加到操作員=參數使其podstawowa &運算符=(const的 podstawowa & obiekt)。你能告訴我爲什麼發生這種情況嗎? :)

其中一個類podstawowa.h:

#ifndef PODSTAWOWA_H 
#define PODSTAWOWA_H 
#include <iostream> 
using namespace std; 

class podstawowa 
{ 
private: 
    int alfa; 
    int beta; 
    const int staly; 
public: 
    podstawowa(int=0, int=0); 
    podstawowa(const podstawowa& wzor); 
    ~podstawowa(); 
    podstawowa& operator=(podstawowa& obiekt); 
    ostream& operator<<(ostream &strumien); 
}; 

#endif // PODSTAWOWA_H 

Podstawowa.cpp

#include "podstawowa.h" // class's header file 
#include <iostream> 
using namespace std; 


podstawowa::podstawowa(int alf,int bet): alfa(alf), beta(bet),staly(0) 
{} 

podstawowa::podstawowa(const podstawowa& wzor):staly(0){ 
this->alfa = wzor.alfa; 
this->beta = wzor.beta; 

           } 

podstawowa::~podstawowa() 
    {} 


podstawowa& podstawowa::operator=(podstawowa& obiekt){ 
     this->alfa = obiekt.alfa; 
     this->beta = obiekt.beta; 
     return *this; 
     } 


ostream& podstawowa::operator<<(ostream &strumien){ 
strumien << "Alfa: "; 
strumien << this->alfa; 
strumien << "\n"; 
strumien << "Beta: "; 
strumien << this->beta; 
strumien << "\n"; 
return strumien; 
} 

另一類,從podstawowa繼承:pochodna.h

#ifndef POCHODNA_H 
#define POCHODNA_H 

#include "podstawowa.h" 
class pochodna : public podstawowa 
{ private: 
double x; 
double y; 
public: 
    pochodna(double=0, double=0); 
    pochodna(pochodna&); 
    ~pochodna(); 
    pochodna& operator=(pochodna&); 
    friend ostream& operator<<(ostream&, pochodna&); 
}; 

#endif // POCHODNA_H 

pochodna。 cpp

#include "pochodna.h" // class's header file 

pochodna::pochodna(double iks, double ygr):podstawowa(), x(iks),y(ygr) 
{} 
pochodna::pochodna(pochodna & wzor): podstawowa(wzor) { 

         this->x=wzor.x; 
         this->y=wzor.y; 
         } 


pochodna::~pochodna() 
{} 


pochodna& pochodna::operator=(pochodna& obiekt){ 
     (*this).podstawowa::operator=(obiekt); 
     this->x=obiekt.x; 
     this->y=obiekt.y; 
     } 

ostream& operator<<(ostream& strumien, pochodna& obiekt){ 
    obiekt.podstawowa::operator<<(strumien); 
    strumien << "X: " << obiekt.x << "\nY: " << obiekt.y <<"\n"; 
    return strumien; 
    } 

Main.cpp的

#include <cstdlib> 
#include <iostream> 
#include "podstawowa.h" 
#include "pochodna.h" 
using namespace std; 

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

pochodna pierwsza; 
pochodna druga(0.123, 3.14); 
cout << pierwsza << druga; 
pierwsza = druga; 
cout << "Po pierwsza = druga: \n"; 
cout << pierwsza << druga; 
pochodna enta(druga); 
cout<< "teraz enta \n" << enta; 
system("PAUSE"); 
return EXIT_SUCCESS; 
} 
+2

*感嘆*這就是爲什麼用母語編寫代碼是一個壞主意。無論如何,請儘量縮小範圍(製作SSCCE)。試着隔離你沒有的所有不必要的東西的問題。 –

+1

逆波蘭表示法:'{} Foo〜default Foo = Foo class'。 –

+1

請在發佈之前花點時間在本網站上閱讀*。看看其他帖子是什麼樣子,以及成功的問題與不成功的問題的區別。閱讀FAQ,做一些簡短的例子,然後發表一些簡潔的文章。 –

回答

0

您修改函數定義採取另一種類型的參數(常量pochodna &),而你的函數聲明(一個在頭文件)還是(pochodna &)。這使得兩個完全不同的功能。所以這就是爲什麼連接器抱怨缺少功能身體pochodna(pochodna &)。 只需將const添加到您的頭函數定義中即可解決問題。

+0

*(ofc,更改也在頭文件中完成)*他說他改變了這一點。 –

+0

那麼,那麼可能我們需要看到完整的代碼清單,並且隨處可以完成'const'修改。因爲無論什麼話題 - 起始者告訴我,我在他的代碼中看到非const聲明pochodna(pochodna&);和鏈接器錯誤,這告訴我相同的。 – Bogolt

+0

我同意這聽起來像一個愚蠢的錯誤。 –