2013-06-28 38 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

我同意这听起来像一个愚蠢的错误。 –