创建实例的 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(); 函数,您需要为 CubeCircle 类重新定义它......所以回到你的问题,抽象类应该被称为 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++ 和 C# 之间编组类实例的指针

在c++中,接口能实例化吗?下面是接口实例化吗?operFactory是啥?我初学。

c++调用webservice接口的几种方法以及实例

c++调用webservice接口的几种方法以及实例

如何通过 Python/C API 将 Python 实例传递给 C++

C++ 新运算符。创建新实例