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

Posted

技术标签:

【中文标题】复制“const”构造函数 - 链接器错误?【英文标题】:Copy "const" constructor - linker error? 【发布时间】:2013-06-28 09:40:24 【问题描述】:

下面的程序只是为了尝试继承,下面的代码工作得很好......直到我在继承类“pochodna”的复制构造函数中添加“const”而不做任何改变。这使得代码按以下方式更改(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;

【问题讨论】:

Sigh 这就是为什么用母语编写代码是个坏主意。无论如何,请尽量缩小范围(制作 SSCCE)。尝试仅隔离您遇到的问题,而不使用所有不必要的麻烦。 反向波兰表示法: Foo~ default Foo = Foo class. 请在发帖前花点时间阅读本网站。查看其他帖子的外观,以及成功问题与不成功问题的区别。阅读常见问题解答,制作一些简短的示例,然后发布一些简明扼要的内容。 我将所有代码一起粘贴到compileonline.com/compile_cpp_online.php 中,运行良好,您确定构建正确吗? 您是否尝试在重新编译之前执行清理? 【参考方案1】:

您修改了函数定义以采用另一种类型的参数( const pochodna& ),而您的函数声明(头文件中的那个)仍然是 (pochodna&) 。这使得两个完全不同的功能。这就是链接器抱怨缺少函数体 pochodna(pochodna&) 的原因。 只需将 const 添加到您的头函数定义中即可解决问题。

【讨论】:

(ofc,头文件中也做了改动)他说他改了。 好吧,那么我们可能需要查看完整的代码清单,并在各处进行“const”修改。因为无论 topic-starter 说什么,我在他的代码中都看到了非常量声明 pochodna(pochodna&);和链接器错误告诉我同样的情况。 我同意这听起来像是一个愚蠢的错误。

以上是关于复制“const”构造函数 - 链接器错误?的主要内容,如果未能解决你的问题,请参考以下文章

拷贝构造函数详解

拷贝构造函数详解

为啥在通过 const 引用传递临时值时调用复制构造函数?

为啥 C++ 复制构造函数必须使用 const 对象?

复制构造函数中的 const 而不是 const?

为啥我们使用 const 和 reference 作为参数来复制构造函数?