繁体   English   中英

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

[英]C++ can't define virtual function OUTSIDE classes and header file

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

#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类和头文件功能?

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

所以链接器抱怨因为找不到构造器定义

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

Implement() = default;

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

Implement的析构函数也是如此。


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

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

现在,随着时间的推移,对象已被正确处理,您还应该将abstractAdd的析构函数也设为虚拟。 因为现在您正在多态破坏对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM