[英]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.