复制“const”构造函数 - 链接器错误?

时间:2013-06-28 09:40:25

标签: c++ inheritance

以下程序只是试图继承并且以下代码工作得很好......直到我将“const”添加到继承类“pochodna”中的复制构造函数而不更改任何内容。这使代码以下列方式更改(ofc,更改也在头文件中完成):

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

更改后编译器显示以下错误:

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

当我将“const”添加到operator =参数使其成为podstawowa& operator =( 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;
}

1 个答案:

答案 0 :(得分:0)

你修改了函数定义以获取另一种类型的参数(const pochodna&amp;),而你的函数声明(头文件中的那个)仍然是(pochodna&amp;)。这使得两个完全不同的功能。这就是为什么链接器抱怨缺乏功能体pochodna(pochodna&amp;)。 只需在标题函数定义中添加const即可解决问题。