c++中的继承:错误C2011
Inheritance in C++: Error C2011
我试图通过继承在c++屏幕上显示不同颜色的tile。我有一个基类叫做Tile,然后有两个派生类叫做GreenTile和VanillaTile。
在我的主程序中,当我通过创建一个GreenTile对象或一个VanillaTile对象只创建一个GreenTile或一个VanillaTile时,它可以正常工作:
GreenTile greenTile(0,0);
greenTile.show(screen);
问题是,当我创建GreenTile和VanillaTile对象并尝试显示两者时,我得到"错误C2011: 'Tile': 'class'类型重新定义"。
GreenTile greenTile(0,0);
VanillaTile vanillaTile(0,0);
greenTile.show(screen);
vanillaTile.show(screen);
您遇到的问题与继承无关:这是使用所谓的include保护的问题。注意,这些通常只会防止编译器发出的多个定义错误,而不是链接器发出的。
在您的源代码中,main
是(假设是main.cpp
),您可能有
#include "GreenTile.h" // (1)
#include "VanillaTile.h" // (2)
在每个标题中都有
#include "Tile.h"
如果您的Tile.h
没有包含守卫,您将包含两次类Tile
的定义。你的Tile.h应该像这样:
#ifndef TILE_H
#define TILE_H
class Tile
{
...
};
#endif
预处理器复制main.cpp
开头头(1)和(2)的内容。使用它们,它复制了两次Tile.h
,但由于这些保护,只保留了第一个副本的内容。这样,当编译器看到Tile
类的单一定义时,它就不会抱怨了。
在这种情况下也可以使用#pragma。#pragma有一些优于include保护的优点:它包含更少的代码,避免了名称冲突,有时需要更少的编译时间。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 错误 C2011 'vars::strct': 'struct' 类型重定义
- 获取生成错误:错误 C2011:'ProfileSettings':'class'类型重定义
- VC++ C2011 重定义错误 - 未使用的头文件
- C2011错误C 试图进行多态性
- 错误 C2011:'SelectorBox':'class'类型重定义
- 错误 13 错误 C2011:'ConnectionInfo':'struct'类型重定义
- c++中的继承:错误C2011
- 错误 C2011:"类类型重定义 - 基本继承
- 错误 C2011:"XX":"类"类型重定义