所以我在我的C ++类中有一个赋值,要求我创建一个名为Project的抽象基类,以及一个名为Task的接口。现在他给了我们main的驱动程序代码,并且在其中它要求我们创建一个接口“Task”的实例,并且我不断收到错误,说“你不能创建一个抽象基类的实例”这里是我的“任务“接口头文件和主...我希望它足够了。
#pragma once
#ifndef TASK_h
#define TASK_h
class Task
{
public:
Task();
virtual ~Task();
virtual void addPrereq(Task *pt) = 0;
virtual bool ready() = 0;
virtual bool done() = 0;
virtual void doIt() =0;
};
#endif
主要:
#include "stdafx.h"
#include "CompositeProject.h"
#include "MinorProject.h"
#include "SimpleProject.h"
#include "Task.h"
int _tmain(int argc, _TCHAR* argv[])
{
// Create tasks
Task* tasks[7];
for (int i = 0; i != 7; ++i)
tasks[i] = new Task();//This is where my error is coming from
// Set prerequisites
tasks[1]->addPrereq(tasks[0]);
tasks[2]->addPrereq(tasks[1]);
tasks[3]->addPrereq(tasks[2]);
tasks[3]->addPrereq(tasks[4]);
tasks[4]->addPrereq(tasks[0]);
tasks[5]->addPrereq(tasks[4]);
tasks[6]->addPrereq(tasks[3]);
tasks[6]->addPrereq(tasks[5]);
return 0;
}
现在据我所知,抽象基类和接口之间的区别在于抽象基类通常具有受保护的构造函数,并且至少有一个纯虚方法。现在,一个接口的所有方法都是纯虚拟的,基本上都有一个模板。现在我不明白我的老师是如何或为什么要求我们创建接口任务的实例。他明确地在作业的其他地方说过,期望的文件是“Task.h和Task.cpp”。我觉得这里有一个关键因素。谢谢!
答案 0 :(得分:1)
默认情况下,您无法创建抽象基类的对象,因为ABC就像一个蓝图,您可以在其上创建实际的实现。举个例子,你可以定义一个Shape
抽象基类,它有一个名为virtual void form()=0;
的方法,用于重新定义某种几何形状的形式,在该类上你可以定义另一个名为Cube
的类。另一个名为Circle
,但这些类中的每一个都继承了void form();
函数,您需要为Cube
和Circle
类重新定义...所以回到你的问题抽象类应该被称为Project(正如你所说),你的代码应该看起来像这样
#ifndef TASK_H
#define TASK_H
class Project { //project is the abstract base class
public:
Project();
virtual ~Project();
virtual void addPrereq(Project *pt) = 0;
virtual bool ready() = 0;
virtual bool done() = 0;
virtual void doIt() =0;
};
class Task:public Project {
Task();
virtual ~Task();
virtual void addPrereq(Task *pt);
virtual bool ready();
virtual bool done();
virtual void doIt();
}
#endif // PROJECT_H
总结:
void move();
类中有Shape
函数,那么你可以在所有继承的类中使用该函数,这样你就不会# 39; t需要声明所有虚函数