C ++无法定义虚函数OUTSIDE类和头文件

时间:2018-11-01 07:06:24

标签: c++

由于函数名称已经在头文件中声明:function.h,并且头文件已预先存储在OJ中,因此我需要在myAdd中(也称为OUTSIDE类)定义main.cpp。但是,我可以在网上找到大多数关于虚函数的教程,只是定义该函数在类内部应该执行的操作。这是头文件:

#ifndef _FUNCTION_H_
#define _FUNCTION_H_
class abstractAdd
{
public:
    abstractAdd(){};
    ~abstractAdd(){};
    virtual int myAdd(int a, int b) = 0;

};

class Implement  : public abstractAdd
{
private:

public:
    Implement();
    ~Implement();

    int myAdd(int a,int b);

};
;

#endif

我在main.cpp

中尝试过
//include every libraries needed
#include "function.h"

int Implement::myAdd(int a,int b)
{
    int c=a+b;
    return c;

}

int main(){
    abstractAdd& ra = *new Implement();
    string input;
    while(getline(std::cin, input)){
        istringstream testcase(input);
        int a,b;
        testcase >> a;
        testcase >> b;
        cout << ra.myAdd(a,b) << endl;
    }

    return 0;
    }

但是编译器说:

Undefined symbols for architecture x86_64:
  "Implement::Implement()", referenced from:
      _main in cc3KANpW.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

如何实现OUTSIDE类和头文件功能?

1 个答案:

答案 0 :(得分:3)

new Implement()将创建一个对象。这需要调用构造函数。您声明了构造函数Implement();,但未在任何地方定义它。

因此,链接器抱怨是因为它找不到构造函数定义

如果您只是希望使用默认构造函数作为编译器对其进行定义,则可以如下声明:

Implement() = default;

它将是默认值,并且是内联定义的。

Implement的析构函数也是如此。


顺便说一句,尽管您的程序很小,可能是托管的,但它仍然包含泄漏。您使用new进行分配,但没有delete进行创建的对象。在实际的生产代码中,这是不可接受的。您可以使用智能指针简化代码并摆脱这种担忧:

std::unique_ptr<abstractAdd> ra = std::make_unique<Implement>();

既然时间到了,就可以正确处理该对象了,您还应该将abstractAdd的析构函数设为虚拟。因为现在您正在多态破坏对象。