由于函数名称已经在头文件中声明: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类和头文件功能?
答案 0 :(得分:3)
new Implement()
将创建一个对象。这需要调用构造函数。您声明了构造函数Implement();
,但未在任何地方定义它。
因此,链接器抱怨是因为它找不到构造函数定义。
如果您只是希望使用默认构造函数作为编译器对其进行定义,则可以如下声明:
Implement() = default;
它将是默认值,并且是内联定义的。
Implement
的析构函数也是如此。
顺便说一句,尽管您的程序很小,可能是托管的,但它仍然包含泄漏。您使用new
进行分配,但没有delete
进行创建的对象。在实际的生产代码中,这是不可接受的。您可以使用智能指针简化代码并摆脱这种担忧:
std::unique_ptr<abstractAdd> ra = std::make_unique<Implement>();
既然时间到了,就可以正确处理该对象了,您还应该将abstractAdd
的析构函数设为虚拟。因为现在您正在多态破坏对象。