从另一个抽象类得出一个抽象类时,C 中的类重新定义错误

Class redefinition error in C++ while deriving an Abstract Class from another Abstract Class

本文关键字:抽象类 错误 新定义 定义 另一个 一个      更新时间:2023-10-16

我是C 抽象类的新手,我正在尝试学习如何使用它。因此,我首先定义一个仅具有纯函数的抽象类,让我们称之为SceneObj,到目前为止很好。之后,我首先定义一个正在调用IScreen的新抽象类;这个新的Class也是另一个抽象类,但增加了新的要求。

不幸的是,当尝试编译此简单代码时,我会遇到以下错误:error C2011: 'IScreen' : 'class' type redefinition

我正在使用Visual Studio 2012和我要编译的代码如下:

#include <stdlib.h>
using namespace std;
class SceneObj
{
protected:
    float center;
public:
    virtual void SetCenter(float,float,float) = 0;
    virtual void SetCenter(float) = 0;
    virtual float GetCenter() = 0;
    virtual ~SceneObj();
};
class IScreen : public SceneObj
{
public:
    virtual void SetCenter(float,float,float) = 0;
    virtual void SetCenter(float) = 0;
    virtual float GetCenter() = 0;
    virtual float GetStartCorner() = 0;
    virtual void SetSize(float,float) = 0;
    virtual void SetSize(long) = 0;
    virtual long GetSize() = 0;
    virtual ~IScreen();
};

有人可以指出我的漏洞/p>什么/p>

编辑:将代码更改为最小值EDIT2:这是在header file中,显然,如果我将其更改为.cpp,它会毫无问题地编译。但是我需要/想在headers中声明我的课程,然后在.cpp中定义。

c 程序还使用预处理器来定义标头警卫。标题卫队依靠预处理器变量。预处理器变量有两个可能的状态:定义或未定义。#define指令命名并定义该名称是预处理器变量。还有其他两个指令测试是否给定的预处理器变量已定义或尚未定义:如果变量,#ifdef是正确的已经定义了,如果尚未定义该变量,则#ifndef是正确的。如果测试是是的,然后将#ifdef#ifndef之后的所有内容处理到匹配#endif。我们可以使用这些设施来防止多个包容性,如下所示:

 #ifndef SALES_DATA_H
 #define SALES_DATA_H
 #include <string>
 struct Sales_data {
 std::string bookNo;
 unsigned units_sold = 0;
 double revenue = 0.0;
 };
 #endif  //SALES_DATA_H

例如,在标题文件中,您会找到类似follwing的东西:

#ifndef __*__SceneObj
#define __*__SceneObj__
//Place the abstract class here
#endif

因此,您必须将抽象类放入#define和#endif之间。(这是编译器将考虑的定义)。您根本没有CPP文件上的这些礼节。这就是为什么它在那里工作的原因。另外,尝试每个标头文件有一个类,因此请勿在同一标头文件上声明子类。

这意味着您已经定义了类型ISCREEN的某个地方。通常,编译器会引用重复的定义。

因此调查错误消息。

至于您的代码段,它是无关紧要的。

MS VS通常会提供多个消息,如果发现错误。

另一个原因可能是您将CPP模块包含在模块中的CPP模块。

例如

标题文件:header.h

#include <stdlib.h>
using namespace std;
class SceneObj
{
   //...
};
class IScreen : public SceneObj
{
   //...
};

带有成员功能定义的CPP模块:模块,CPP

#include "header.h"
//...

Main

的模块
#include "header.h"
#include "module.cpp"
//...

还包括指令

#pragma once

在您的标题文件中。