[英]Class redefinition error in C++ while deriving an Abstract Class from another Abstract Class
我是C ++抽象类的新手,我正在尝试学习如何使用它。 因此,我首先定义了一个仅包含纯函数的抽象类,我们将其称为SceneObj
类,到目前为止, 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();
};
有人可以指出此代码的缺陷是什么/在哪里?
编辑:将代码更改为最少的一个edit2:这在header file
并且显然,如果我将其更改为.cpp
它可以毫无问题地进行编译。 但是我需要/想要在headers
声明我的类,然后在.cpp
定义。
C ++程序还使用预处理器定义头保护。 标头防护依赖预处理程序变量。 预处理程序变量具有以下两种可能状态之一:已定义或未定义。 #define
指令采用名称并将该名称定义为预处理器变量。 还有两个指令可以测试是否已定义给定的预处理器变量:如果已定义变量,则#ifdef
为true;如果未定义变量,则#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 __*__SceneObj
#define __*__SceneObj__
//Place the abstract class here
#endif
因此,您必须将抽象类放在#define和#endif之间。 (这是编译器将考虑的定义)。 您只是在cpp文件中没有这些礼节。 这就是为什么它在那里工作的原因。 另外,尝试每个头文件具有一个类,因此不要在同一头文件上声明子类。
这意味着您已经定义了IScreen类型。 通常,编译器会引用重复的定义。
因此,请检查错误消息。
至于您的代码段则无关紧要。
如果发现错误,MS VS通常会给出几条消息。
另一个原因可能是您在具有main函数的模块中包括了带有成员函数定义的cpp模块。
例如
头文件:header.h
#include <stdlib.h>
using namespace std;
class SceneObj
{
//...
};
class IScreen : public SceneObj
{
//...
};
具有成员函数定义的cpp模块:module,cpp
#include "header.h"
//...
主模块
#include "header.h"
#include "module.cpp"
//...
还包括指令
#pragma once
在您的头文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.