Ошибка переопределения класса C++

Рейтинг: 1Ответов: 3Опубликовано: 10.06.2011

Не пойму в чём ошибка, в cpp файле:

#include "myclases.h"  
class AAA{  
public:  
..........  
private:  
..........  
};

В файле myclases.h прототип этого класса!
Ошибка: error C2011: AAA: переопределение типа "class"

Ответы

▲ 8Принят

Так выглядит declaration класса:

class Player {
private:
  int health;
  int strength;
  int agility;
public:
  void move();
  void attackMonster();
  void getTreasure();
};

Т.е. это просто описание интерфейса класса.

Понятное дело, что оно должно присутствовать в файлах ОДИН раз, но в каждом cpp, где этот класс используется. Поэтому определение класса выносят в h-шник.

Если же у Вас определение класса есть и в h-файле, и во включающем его cpp-файле, то естественно, что компилятор заругается. Поэтому если Вы собираетесь использовать этот класс в нескольких файлах, то разумно в cpp-файл вынести исключительно реализацию функций-членов (т.е. function definition). Т.е. в cpp-файле будет:

#include <player.h> // наш h-файл
void Player::move
{
// код ф-ции
}
void Player::attackMonster()
{
// код ф-ции
}
void Player::getTreasure()
{
// код ф-ции
}

Шаблонные классы вместе со своими ф-циями удобно целиком описывать в h-нике. Все равно они потом будут подставляться по месту использования компилятором.

Ну, и не забывайте в своих h-файлах делать блоки защиты от повторного включения:

#ifndef MY_SYMBOL_H
#define MY_SYMBOL_H
// здесь идет собственно тело h-ника
#endif //MY_SYMBOL_H
▲ 3

Что вы имеете ввиду под прототипом класса? Такого понятия в С++ нет. Есть понятие forward declaration. Оно позволяет использовать имя класса, не имея его определения. Например:

class A;
void doSomething(A* a);

Конструкция вида:

class A {
...
};

явлеется определением класса, и не может встречаться в программе больше одного раза.

▲ 2

Должна быть строгая структура файлов, когда вы создаёте класс. Например, сначала идёт файл CMyClass.h, в котором вы заводите класс, его поля, свойства и методы, затем файл СMyClass.cpp, в котором идёт #include CMyClass.h, для того чтобы можно было взять свойства и методы из .h файла, соответственно далее задаётся поведение методов этого класса. А уже где-нибудь в файле MyProjectName.cpp вы снова цепляете .h файл вашего класса, создаёте экземпляр класса и работаете с ним. Надеюсь понятно написал))