Наследование в C ++: ошибка C2011 - PullRequest
3 голосов
/ 04 декабря 2011

Я пытаюсь отобразить плитки разных цветов на экране в C ++ посредством наследования.У меня есть базовый класс с именем Tile, а затем два производных класса с именами GreenTile и VanillaTile.

В моем основном случае, когда я создаю только GreenTile или только VanillaTile, создавая объект GreenTile или объект VanillaTile, он работаетправильно:

GreenTile greenTile(0,0);
greenTile.show(screen);

Проблема в том, что когда я создаю объекты GreenTile и VanillaTile и пытаюсь отобразить оба, я получаю сообщение об ошибке «C2011:« Tile »: переопределение типа« класс »».

GreenTile greenTile(0,0);
VanillaTile vanillaTile(0,0);
greenTile.show(screen);
vanillaTile.show(screen);

Ответы [ 3 ]

5 голосов
/ 04 декабря 2011

То, с чем вы сталкиваетесь, не имеет ничего общего с наследованием: это вопрос использования так называемых include guard .Обратите внимание, что они, как правило, защищают только от нескольких ошибок определения, выданных компилятором, а не компоновщиком.

4 голосов
/ 04 декабря 2011

В вашем исходном коде, где 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

Препроцессор копирует содержимое заголовков (1) и (2) в начале main.cpp. С ними он копирует дважды Tile.h, но из-за этих охранников остается только содержимое первого экземпляра. Таким образом, компилятор не жалуется, поскольку видит единственное определение класса Tile.

0 голосов
/ 02 октября 2014

В этой ситуации также можно один раз использовать #pragma. Однажды у #pragma есть некоторые преимущества по сравнению с включенными средствами защиты: она содержит меньше кода, избегает конфликтов имен и иногда занимает меньше времени компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...