从另一个抽象类得出一个抽象类时,C 中的类重新定义错误
Class redefinition error in C++ while deriving an Abstract Class from another Abstract Class
我是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
在您的标题文件中。
- 抽象类错误,请参阅声明" "是抽象的
- C++:处理抽象类中的错误时出现问题
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 与 std::unique_ptr 和抽象类关联的编译错误
- 无法实例化抽象类错误
- 错误 - 变量类型 "X" 是一个抽象类 - c++
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 错误:不允许使用抽象类类型的对象
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 如何修复错误C2259:无法实例化抽象类
- 在另一个项目中包括继承的类时,抽象类的链接器错误
- 使用从WINRT网格类派生的抽象类时,Casttobase未解决的外部符号错误
- 抽象类和唯一指针 c++ 错误
- 从另一个抽象类得出一个抽象类时,C 中的类重新定义错误
- 使用std :: make_shared抽象类实例化的错误
- C++ Qt 5 中构造函数的抽象类错误
- C++,无法实例化抽象类错误
- 抽象类出现C++ILink32错误
- 错误 C2259:'CDocument':无法实例化抽象类
- C++ SFML 中的抽象类错误