C+中的类重新定义错误+;从另一个抽象类派生抽象类时 我对C++抽象类很陌生,我正在努力学习如何使用它。因此,我首先定义了一个只有纯函数的抽象类,我们称这个类为SceneObj,到目前为止还不错。之后,我首先定义一个新的抽象类,我将调用它IScreen;这个新的类也是另一个抽象类,但它增加了新的需求

C+中的类重新定义错误+;从另一个抽象类派生抽象类时 我对C++抽象类很陌生,我正在努力学习如何使用它。因此,我首先定义了一个只有纯函数的抽象类,我们称这个类为SceneObj,到目前为止还不错。之后,我首先定义一个新的抽象类,我将调用它IScreen;这个新的类也是另一个抽象类,但它增加了新的需求,c++,abstract-class,C++,Abstract Class,不幸的是,在试图编译这段简单代码时,我遇到了以下错误:错误C2011:'IScreen':'class'类型重新定义 我使用的是Visual Studio 2012,我尝试编译的代码如下: #include <stdlib.h> using namespace std; class SceneObj { protected: float center; public: virtual void SetCenter(float,float,float) = 0;

不幸的是,在试图编译这段简单代码时,我遇到了以下错误:
错误C2011:'IScreen':'class'类型重新定义

我使用的是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();
};
#包括
使用名称空间std;
类SceneObj
{
受保护的:
浮心;
公众:
虚拟空隙设置中心(浮动、浮动、浮动)=0;
虚空设置中心(浮动)=0;
虚拟浮点GetCenter()=0;
虚拟~SceneObj();
};
类IScreen:publicsceneobj
{
公众:
虚拟空隙设置中心(浮动、浮动、浮动)=0;
虚空设置中心(浮动)=0;
虚拟浮点GetCenter()=0;
虚拟浮点GetStartCorner()=0;
虚空设置大小(浮动,浮动)=0;
虚空集合大小(长)=0;
虚拟长GetSize()=0;
虚拟~IScreen();
};
有人能告诉我代码中的漏洞是什么/在哪里吗

编辑:将代码更改为最小代码
edit2:这是在
头文件中
,显然,如果我将其更改为
.cpp
,它编译时不会出现问题。但是我需要/想要在
标题中声明我的类,然后在
.cpp
中定义

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

因此,请调查错误消息

至于你的代码片段,那么它是无关的

如果发现错误,MS VS通常会给出多条消息

另一个原因可能是您在带有main的模块中包含了带有成员函数定义的cpp模块

比如说

头文件:Header.h

#include <stdlib.h>
using namespace std;

class SceneObj
{
   //...
};

class IScreen : public SceneObj
{
   //...
};
带主电源的模块

#include "header.h"
#include "module.cpp"
//...
还包括指令

#pragma once

在头文件中。

C++程序也使用预处理器来定义头保护。头罩 依赖于预处理器变量。预处理器变量有两个变量之一 可能状态:已定义或未定义。
#define
指令采用名称并定义 将该名称作为预处理器变量。还有两个其他指令测试 给定的预处理器变量已定义或未定义:
#ifdef
如果变量 已定义,如果未定义变量,则
#ifndef
为真。如果测试是 如果为true,则在
#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
\ifndef销售数据\u H
#定义销售数据
#包括
结构销售数据{
std::字符串书号;
未签字单位_已售出=0;
双倍收入=0.0;
};
#endif//销售数据

例如,在头文件中,您会发现如下内容:

#ifndef __*__SceneObj
#define __*__SceneObj__
//Place the abstract class here
#endif
因此,必须将抽象类放在#define和#endif之间。(这是编译器将考虑的定义)。cpp文件中没有这些礼仪。这就是它在那里工作的原因。
另外,每个头文件尝试使用一个类,因此不要在同一头文件上声明子类。

编译器是否添加了类似“Previous declared at”的信息?由于一个类从另一个类继承,因此无需再次声明具有相同签名的相同函数。尝试删除这些。尝试一个最小的、自包含的、没有依赖项的例子,比如Eigen,会有很大帮助。我无法测试,仅通过查看,我看不出您错误的任何原因。@iavr我只是更改了示例,错误persist@yamilife不要更改示例,只需显示编译器的所有消息。-1:“调查错误消息”这并不是这个问题的好答案。@Lightness在轨道上比赛。考虑到提供的信息,这是一个非常好的答案。没有足够的信息是要求OP提供更多信息的理由,不要发布错误答案。@Borgeader这是一个非常好的答案,因为错误消息包含所有必需的信息。@VladFrommosco:Your答案应该是一个评论,你知道的。
#ifndef __*__SceneObj
#define __*__SceneObj__
//Place the abstract class here
#endif