Форум программистов, компьютерный форум CyberForum.ru

Ошибка компиляции, класс, файлы. - C++

Восстановить пароль Регистрация
 
Grigarosh
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
03.07.2011, 20:21     Ошибка компиляции, класс, файлы. #1
Здравствуйте участники форума, недавно занялся программированием по книге Дирка Хенкеманса "Программирование игр на С++"

Компиляция при распределении классов по файлам, возвращает ошибки. Долгие поиски вынудили обратиться к мастерам за помощью

Файл: main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <cstring>
#include "bow.h"
 
using namespace std;
 
class ArcheryCompetition
{
      private:
              int rounds;
              float redScore;
              Bow red;
              float blueScore;
              Bow blue;
              
      public:
             
             ArcheryCompetition(int lrounds);
             ~ArcheryCompetition();
             
             int complete(void);
             
};
      ArcheryCompetition::ArcheryCompetition(int lrounds):
            rounds(lrounds),red(Bow("красный")),blue(Bow("синий")),redScore(0),blueScore(0)
      {
      }
      ArcheryCompetition::~ArcheryCompetition()
      {
      }
      int ArcheryCompetition::complete()
      {
          for(int i = 0; i < rounds; i++)
      {
          cout<<"Тур номер: " <<i+1<< "." << endl;
          red.draw();
          blue.draw();
          
          redScore = (red.fire() + redScore * i)/(i + 1);
          blueScore = (blue.fire() + blueScore * i)/(i + 1);
      }
      
if(redScore == blueScore)
cout<< "Ничья! \n";
else if (redScore < blueScore)
cout<<" Синий лук получает руку принцессы! \n";
else
cout<<" Красный лук получает руку принцессы! \n";
return 1;
}
 
void main(void) // как я понимаю, лучше заменить на int main(void)
{
 ArcheryCompetition plymouthSquare(2);
 plymouthSquare.complete();
 int get = 0;
 cin>>get;
// соответственно return 0;
 }
Файл: bow.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Bow
{
      string color;
      bool drawn;
      int numOfArrows;
public:
       Bow(string aColor);
       ~Bow();
       
       void draw();
       int fire();
};
Файл: bow.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Bow::Bow(string aColor)
{
                numOfArrows = 10;
                drawn = false;
                color = aColor;
                srand((unsigned)time(0));
}
 
Bow::~Bow()
{
}
 
void Bow::draw()
{
     drawn = true;
     cout <<color<< " лук: тетива натянута. " << endl;
}
 
int Bow::fire()
{
               if(!drawn)
               {
                         cout<< color << " лук: тетива не натянута, "
                         << "невозможно произвести выстрел." << endl;
                         return 0;
                         
                         }
                         int score;
                         score = rand() % (10 - 0 + 1) + 0;
                         if(score == 0)
                         cout << color << " лук: промах!" << endl;
                         else
                         cout << color << " лук: выбил " << score 
                         << "очков!" << endl;
                         return score;
                         }
Использую Portable Dev-C++ 4.9.9.2 (мне критичен IDE без инсталляции)
Загружаю все три файла, адрес к файлам - латинский.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2011, 20:21     Ошибка компиляции, класс, файлы.
Посмотрите здесь:

Ошибка компиляции C++
C++ Как вставлять файлы в программу при компиляции
Ошибка при компиляции. Где ошибка? (Работа с классом) C++
ошибка компиляции C++
C++ Ошибка компиляции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
03.07.2011, 20:27     Ошибка компиляции, класс, файлы. #2
И на что ругается ??
Grigarosh
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
03.07.2011, 20:37  [ТС]     Ошибка компиляции, класс, файлы. #3
Сначала компилятор обрабатывает файл main.cpp (при этом если допустить ошибку в других файлах, он также это заметит, т.е. они обрабатываются одновременно?)
Далее, он начинает обрабатывать остальные файлы (судя по всему повторно, но может быть так и необходимо?) и выдает что все переменные/классы undeclared т.е. не обьявлены.

Возможно я что-то напутал с процессом компиляции, но сколько не пытался лазать по настройкам, ничего что можно покрутить не нашел.

Еще слева заметил три окошка, Project, Classes, Debug. Все файлы у меня располагались в первом окне, но что-то подсказывает мне что место файлом с классами во втором. Никаким образом перекинуть туда у меня не вышло.
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
03.07.2011, 21:10     Ошибка компиляции, класс, файлы. #4
А что в файлах Файл: bow.h и Файл: bow.cpp нету никаких #include ?
Если bow.h ссылается на string, то ему надо #include <string> прописать. A для bow.cpp #include "bow.h", он ссылается на класс Bow и ему нужно знать объявление класса.
А .cpp файлы должны подключаться, как файлы "исходного кода".

Цитата Сообщение от Grigarosh Посмотреть сообщение
при этом если допустить ошибку в других файлах, он также это заметит, т.е. они обрабатываются одновременно?
Компилятор будет обрабатывать все файлы, которые задействованы в проекте, чтобы сообщить обо всех ошибках.

PS. Dev-C++ не знаю =)
Bers
Заблокирован
03.07.2011, 21:26     Ошибка компиляции, класс, файлы. #5
ну во-первых, выводите сообщение об ошибке, которое вам привёл КОМПИЛЯТОР.

а ваши домысли скорее всего не верны. потому что, будь они верными, у ваз бы такой проблемы не было. Остаётся только гадать.

А во-вторых в файле bow.cpp самоей первой строчкой напишите: #include "bow.h"

в хедере bow.h должно быть все необходимое для работы класса

Добавлено через 15 минут
Хотя для новичка книга Дирка Хенкеманса,Марка Ли - потрясающая вещь. Скилл прокачивает бесподобно.

Но в своей книге принципы создания много-файлового проекта Дирк практически опустил.
Та скудная инфа, что дана на 132 странице - весьма скунда и КОМПИЛЯТОРО-ЗАВИСИМАЯ.
В частности, он пишет, что нет нужды цеплять к проекту хедер и одноименный спп, а достаточно только один хедер. А спп подключится автоматически. Ну так вот, может это и справедливо для CodeWarrior, в котором писал Дирк, но вот в той же 2008 студии так делать нельзя.

Поэтому, мой вам совет: как распределять код по файлам лучше узнайте из других источников.

И второй совет: почти в самом конце книги Дирк знакомит читателя с directX на примере работы с DirectDraw.

Я настоятельно рекомендую на этом закончить изучение этой книги. Потому что:

1. Дирк очень-очень поверхностно знакомит читателя с работой директдрав7.
Если так интересно как делать видео-игры на примере директдрав - читайте Ламота.
Пострясающее полезная для любого новичка книга. И тоже на примере DirectDraw7

2. DirectDraw7 уже давно не поддерживается. Этот диназавр считается .... устаревшей
технологией. Конечно вреда не будит, если вы потратите время на Ламота. Пользы будит
много, но.... если вы ориентированы на геймдеф, то есть резон посмотреть в сторону более
новых ГАПИ, тот же directX9 и старше, или OpenGL
Grigarosh
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
04.07.2011, 00:19  [ТС]     Ошибка компиляции, класс, файлы. #6
Цитата Сообщение от An1ka Посмотреть сообщение
А что в файлах Файл: bow.h и Файл: bow.cpp нету никаких #include ?
Если bow.h ссылается на string, то ему надо #include <string> прописать. A для bow.cpp #include "bow.h", он ссылается на класс Bow и ему нужно знать объявление класса.
А .cpp файлы должны подключаться, как файлы "исходного кода".
Сделал все точь-в-точь как вы написали и вуаля, все заработало. Благодарю

Поэтому, мой вам совет: как распределять код по файлам лучше узнайте из других источников. И второй совет: почти в самом конце книги Дирк знакомит читателя с directX на примере работы с DirectDraw. Я настоятельно рекомендую на этом закончить изучение этой книги.
Гигантское вам спасибо за ценные советы. Ламот в двух томах уже давно закуплен и лежит на полке, ожидая окончания изучения Хенкеманса и Ли. Я думаю поступлю в точности как вы мне рекомендуете, т.е. окончу Дирка на предпоследней главе. Если вас не затруднит, не посоветуете литературы по DirectX9, основываясь на познанного в дальнейшем А. Ламота?
Bers
Заблокирован
04.07.2011, 11:53     Ошибка компиляции, класс, файлы. #7
На мой взгляд ценность книги Ламота "программирование игр для Windows. Советы профессионала" не столько в том, что он рассказывает, как пользоваться DirectDraw, сколько в том, что он преподносит и очень тщательно расжовывает для новичка многие базовые принципы архитектуры видео-игры, попутно цепляя необходимые, но казалось бы перпендикулярные темы: взаимодействие с ОСью, ресурсы, как кодируется формат цвета, простейшие примеры оптимизации алгоритмов, и тп.

Поэтому, после его книги перепрыгнуть на какой нибудь DirectX9 или OpenGL - проблемы не будит. А вот знания, в плане создания костяка программы для видео-игры могут здорова пригодится.

Насчёт книг по OpenGL ничего сказать не могу, сам я пытался читать множество книг, но все они какие то непедагогичные оказались. В результате стартовал по урокам Nehe. И уже только потом, немножко под разобравшись и освоившись, начал понимать разные книги. Опять таки, я слишком мало знаю об этой области, что-бы что-то утверждать.

Насчёт DirectX хвалят многих авторов. Лично мне очень понравилась книга Горнакова С.Г. "DirectX 9. Уроки программирования на C++"

Понравилась именно из-за того, что он очень педагогично и доходчиво объясняет новичку материал. Не вываливает на голову сразу кучу, а излагает материал последовательно. И больше всего мне у него понравилось - у него любая теоретическая выкладка тут же подкрепляется практическим примером. То есть сразу понятно, как это работает.

/ps как самоучка, я заметил, что лучше всего в первый момент времени усваиваются книги по типу Хенкеманса - материал довольно поверхностный, но зато просто усваивается.
И только потом, уже подковавшись чуток, нужно переходить на книги других авторов, которые пишут тоже самое, но капают намного глубже. Так получается углубленное обучение.

/pss Даже самый простенький графический движок на с++ потребует от вас многих знаний о языковых конструкциях с++, о которых Хенкеманс ничего не сообщал (дабы не сбивать новичка с толку). Поэтому, параллельно Ламоту, рекомендую вам найти какой нибудь материал по более углубленному изучению самого языка с++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2011, 20:30     Ошибка компиляции, класс, файлы.
Еще ссылки по теме:

Ошибка компиляции C++
C++ Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет
Ошибка компиляции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Grigarosh
5 / 5 / 0
Регистрация: 03.07.2011
Сообщений: 30
09.07.2011, 20:30  [ТС]     Ошибка компиляции, класс, файлы. #8
Снова возникли проблемы, теперь уже в следующей задаче, той же книги (Дирк Хенкеманс, Марк Ли "Программирование игр на C++"

Неоднократно перепроверенный код:

DragonLord.cpp \\main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
#include "BlueDragon.cpp"
#include "RedDragon.cpp"
#include "BlackDragon.cpp"
 
using namespace std;
 
int menuChoice();
 
int main (void)
{
    srand(time(0));
    Dragon* dragons[3];
    int hp = 15;
    int armour = 2;
    int tempArmour;
    int tempAttack;
    dragons[0] = new RedDragon(rand()%4+1);
    dragons[1] = new BlackDragon(rand()%4+1);
    dragons[2] = new BlueDragon(rand()%4+1);
    Dragon* d = dragons[rand()%3];
    cout << "Добро пожаловать, благородный рыцарь.\n"
    << "Ты должен спасти принцессу."
    << "Ее похитил "
    << d->getName() << ".\n"
    << "Ты должен победить дракона.\n";
    cout << "Твоя сила: " << hp << endl;
    while (d->isAlive() && hp>0)
    {
          int choice = menuChoice();
          if (choice == 3) goto RUN;
          else if (choice == 1)
          {
               tempAttack = rand()%16+5;
               tempArmour = armour;
          }
          else 
          {
                  tempAttack = rand()%11;
                  tempArmour = armour + 4;
                  }
                  hp -= d->attack(armour);
                  d->defend(rand()%16-5);
                  cout << "\nТы наносишь мощный удар и ущерб "
                  << tempAttack << " damage.\n";
                  cout << "Твоя сила: " << hp;
                  }
                  if (d->isAlive())
                  cout << "\nТы побежден "
                  << " могущественным драконом.\n";
                  else
                  cout <<"\n\nТы убил дракона!"
                  << " Поздравляем.\n"
                  << "Принцесса спасена.\n";
                return 0;
                RUN:
                    cout <<"\nТы струсил и убежал.\n";
                    return 0;
                }
                
                int menuChoice()
                {
                    int choice;
                    do {
                        cout << endl
                        << "[1]Атаковать\n"
                        << "[1]Оборонятся\n"
                        << "[3]Бежать\n";
                    cin >> choice;
                    } while(choice < 1 && choice >3);
                    return choice;
                    }
Dragon.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <cstdlib>
#include <string>
#include <ctime>
 
#define MAX(a,b) a>b? a:b
 
using namespace std;
 
class Dragon
{
private:
        int speed;
        string name;
        int hitPoints;
        int armour;
        int treasure;
        int clawDamage;
        int size;
protected:
          Dragon(int theSize);
          int getArmour() {return armour;}
          int& getHitPoints() {return hitPoints;}
          int getClawDamage() {return clawDamage;}
          int getSize() {return size;}
          virtual int attack(int targetArmour, int specialDamage);
public:
          virtual int attack(int targetArmour) = 0;
          virtual void defend(int damage) = 0;
          int getTreasure() {return treasure;}
          virtual string getName() {return name;}
          int getSpeed() {return speed;}
          bool isAlive() {return hitPoints >0;}
};
Dragon::Dragon(int theSize):size(theSize)
{
if (size < 1 || size > 4)
size = 3;
clawDamage = 2 * size;
speed = 3 * size;
hitPoints = 4 * size;
armour - size;
treasure = 1000 * size;
srand(time(0));
}
 
int Dragon::attack(int targetArmour, int specialDamage)
{
    int useSpecial = rand() % 2;
    int damage;
    if (useSpecial)
       damage = specialDamage;
       else damage - getClawDamage();
       return MAX(damage - targetArmour,0);
}
RedDragon.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class RedDragon : public Dragon
{
private:
int fireDamage;
public:
       RedDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Красный дракон";}
};
 
RedDragon::RedDragon(int theSize)  : Dragon(theSize)
{
fireDamage = 4*getSize();
}
 
int RedDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, fireDamage);
}
 
void RedDragon::defend(int damage)
{
     getHitPoints() -= (damage - getArmour())/3;
}
BlueDragon.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class BlueDragon : public Dragon
{
private:
int iceDamage;
public:
       BlueDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Синий дракон";}
};
 
BlueDragon::BlueDragon(int theSize):
                         Dragon(theSize)
{
iceDamage = 3*getSize();
}
 
int BlueDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, iceDamage);
}
 
void BlueDragon::defend(int damage)
{
     getHitPoints() -= (damage - getArmour())/2;
}
BlackDragon.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include "Dragon.cpp"
 
class BlackDragon : public Dragon
{
private:
int poisonDamage;
public:
       BlackDragon(int theSize);
       int attack(int targetArmour);
       void defend(int damage);
       string getName() {return "Черный дракон";}
};
 
BlackDragon::BlackDragon(int theSize):
                         Dragon(theSize)
{
poisonDamage = getSize();
}
 
int BlackDragon::attack(int targetArmour)
{
    return Dragon::attack(targetArmour, poisonDamage);
}
 
void BlackDragon::defend(int damage)
{
     getHitPoints() -= damage - getArmour();
}

Вывод компилятора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Compiler: Default compiler
Building Makefile: "D:\Dragon\Makefile.win"
Executing  make...
make.exe -f "D:\Dragon\Makefile.win" all
g++.exe -c Dragon.cpp -o Dragon.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   
 
g++.exe -c DragonLord.cpp -o DragonLord.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   
 
In file included from BlueDragon.cpp:5,
                 from DragonLord.cpp:6:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
 
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
 
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
 
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
In file included from RedDragon.cpp:5,
                 from DragonLord.cpp:7:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
In file included from BlackDragon.cpp:5,
                 from DragonLord.cpp:8:
Dragon.cpp:10: error: redefinition of `class Dragon'
 
Dragon.cpp:10: error: previous definition of `class Dragon'
 
Dragon.cpp:34: error: redefinition of `Dragon::Dragon(int)'
 
Dragon.cpp:34: error: `Dragon::Dragon(int)' previously defined here
 
Dragon.cpp:47: error: redefinition of `int Dragon::attack(int, int)'
 
Dragon.cpp:47: error: `virtual int Dragon::attack(int, int)' previously defined here
 
make.exe: *** [DragonLord.o] Error 1
 
Execution terminated

Безмерно интересно узнать, какую деталь я упустил. Заранее спасибо!
Yandex
Объявления
09.07.2011, 20:30     Ошибка компиляции, класс, файлы.
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru