这是我的基类Shape.h
#ifndef Shape_H
#define Shape_H
#include <iostream>
using namespace std;
class Shape
{
protected:
string name;
bool containsObj;
public:
Shape();
Shape(string, bool);
string getName();
bool getContainsObj();
double computeArea();
};
#endif
Shape.cpp
#include "Shape.h"
Shape::Shape(string name, bool containsObj)
{
this -> name = name;
this -> containsObj = containsObj;
}
string Shape:: getName()
{
return name;
}
bool Shape::getContainsObj()
{
return containsObj;
}
这是我的子类。 Cross.h
#ifndef Cross_H
#define Cross_H
#include <iostream>
#include "Shape.h"
using namespace std;
class Cross: public Shape
{
protected:
int x[12];
int y[12];
public:
Cross();
double computeArea();
};
#endif
Cross.cpp
#include "Cross.h"
Cross::Cross()
{
for (int i = 0; i < 12; i++)
{
this -> x[i] = 0;
this -> x[0] = 0;
}
}
Shape和Cross位于不同的文件中,但位于同一文件夹中。奇怪的是当我编译它时,出现了我以前从未见过的错误,例如“在函数中'ZN5CrossC1Ev',对Shape :: Shape()的未定义引用,'ZN5CrossC1Ev',对Shape :: Shape()的未定义引用,未定义的引用WinMain @ 16“。
我试着自己做一些调试。当我删除Cross构造函数时,它工作正常。但我绝对需要它。任何人都可以向我解释这个吗?
答案 0 :(得分:4)
您没有定义默认构造函数,但是您将其声明为Shape();
。您定义的唯一构造函数是具有string
和bool
参数Shape(string, bool);
的构造函数。
添加
Shape::Shape()
{
}
或删除
Shape();
会解决它。
为了将来的调试,请更仔细地阅读错误,它解释了错误的错误:
undefined reference to Shape::Shape()
答案 1 :(得分:2)
您已为Shape
声明了默认构造函数,但未在任何位置定义它。 Cross
的默认构造函数隐式使用它来初始化其基类。
您可以选择:
Shape
是默认可构造的,则定义构造函数; Cross
以使用其他构造函数初始化Shape
。