C++;创建it实例时的接口问题 < >我在C++类中有一个任务,它要求我创建一个名为Project的抽象基类,以及一个名为任务的接口。现在他给了我们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

C++;创建it实例时的接口问题 < >我在C++类中有一个任务,它要求我创建一个名为Project的抽象基类,以及一个名为任务的接口。现在他给了我们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,c++,inheritance,interface,C++,Inheritance,Interface,主要问题是: #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 T

主要问题是:

#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”。我觉得这里缺少了一个关键因素。谢谢

默认情况下,您不能创建抽象基类的对象,因为ABC就像一个蓝图,您可以在其上创建实际的实现。为了给你一个例子,你可以定义一个
Shape
抽象基类,它有一个名为
virtualvoidform()=0的方法
用于重新定义某些几何形状的形式,在该类上,您可以定义另一个称为
立方体
的类和另一个称为
的类,但这些类中的每一个都继承了
空心形式()函数,您需要为
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(),则ABC中任何非虚拟的方法都会像定义的那样继承Shape
    类中使用code>函数,然后可以在所有继承的类中使用该函数,这样就不需要将所有函数声明为虚拟函数
  • ABC描述使用至少一个纯虚函数的接口,从ABC派生的类使用常规虚函数根据特定派生类的属性实现接口

  • 您应该创建一个从
    任务
    派生的类,并创建该类的实例。你的编译器是对的,你不能创建
    Task
    本身的实例。你的意思是说,你可以将Task接口命名为iTask,然后创建一个名为Task的类,该类使用iTask作为接口?是的<代码>课堂任务:公共iTask
    应该是你想要的。这就是我在想的,唯一让我不满意的是作业上的“预期文件”行。。。不管怎样,谢谢你,伙计@计算机怪胎你可能想和教授谈谈这个问题,因为据我计算,你至少需要四个文件:包含接口定义的头文件(iTask.h)、实现接口的类的头文件和源文件(Task.h和Task.cpp)以及主程序(main.cpp)。