创建实例的 C++ 接口问题
Posted
技术标签:
【中文标题】创建实例的 C++ 接口问题【英文标题】:C++ Interface issues with creating an instance of it 【发布时间】:2014-03-23 18:55:02 【问题描述】:所以我在我的 C++ 类中有一个作业,要求我创建一个名为 Project 的抽象基类和一个名为 Task 的接口。现在他给了我们main的驱动代码,在里面它要求我们创建一个接口“Task”的实例,我一直收到一个错误说“你不能创建一个抽象基类的实例”这是我的“ Task”接口头文件和main..希望够用了。
#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”。我觉得这里缺少一个关键要素。谢谢!
【问题讨论】:
您应该创建一个派生自Task
的类,并创建该类的实例。您的编译器是正确的,您不能创建 Task
本身的实例。
你的意思是,可能会创建一个名为 iTask 的 Task 接口,然后创建一个名为 Task 的类,它使用 iTask 作为接口?
是的! class Task: public iTask
应该是您要查找的内容。
这就是我的想法,唯一让我失望的是作业中的“预期文件”行......无论如何,非常感谢! @computerfreaker
你可能想和教授谈谈,因为据我计算,你至少需要四个文件:包含接口定义的头文件 (iTask.h)、头文件和源文件实现接口的类(Task.h 和 Task.cpp),以及你的主程序(main.cpp)。
【参考方案1】:
默认情况下,您不能创建抽象基类的对象,因为 ABC 就像您创建实际实现的蓝图。举个例子,你可以定义一个Shape
抽象基类,它有一个名为virtual void form()=0;
的方法来重新定义一些几何形状的形式,在那个类上你可以定义另一个名为Cube
的类和另一个名为@987654324的类@但是这些类中的每一个都继承了 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
总结:
-
当类声明包含纯虚函数时,您无法创建该类的对象。
ABC 中的任何非虚拟方法都像定义的那样被继承,如果您在
Shape
类中有一个 void move();
函数,那么您可以在所有继承的类中使用该函数,因此您不需要声明所有虚拟功能
ABC 描述了一个使用至少一个纯虚函数的接口,并且从 ABC 派生的类使用常规虚函数根据特定派生类的属性来实现接口
【讨论】:
以上是关于创建实例的 C++ 接口问题的主要内容,如果未能解决你的问题,请参考以下文章
在c++中,接口能实例化吗?下面是接口实例化吗?operFactory是啥?我初学。