Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
1

Взаимосвязанные исходные файлы

08.10.2012, 17:35. Показов 2694. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать так чтобы в одном исходном файле я мог использовать элементы из другого и наоборот. А то я делаю змейку и у меня не получается сделать чтобы в классе Snake был указатель на Food и в Food указатель на Snake. Я понял что причина в инклуде в основном исходнике, что исходник объявленный ниже, знает про верхний, но нижний не может знать о верхней(((
C++
1
2
#include "Food.cpp" // Не знает Snake
#include "Snake.cpp" // Знает Food
Как сделать так что бы все 2 исходника друг друга знали?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2012, 17:35
Ответы с готовыми решениями:

не понимаю как открыть исходные файлы
не понимаю как открыть исходные файлы

Как включить исходные и заголовочные файлы в проект? (Dev c++)
Решаю задачки из книги Р.Лафоре "Объектно-ориентированное программирование С++" Есть там пример с...

Как в IntelliJ IDEA скомпилировать исходные файлы в файлы классов
Учусь делать апелты <html> <body> <applet code="aplet.class",width="300" height=300> ...

Текстовые файлы. Создать новый файл, объединив исходные файлы
даны текстовые файлы Name1 и Name2 .создать Name3 файл объединив Name1 и Name2 текстовые файлы

29
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 17:38 2
может стоит подключить в Food.h Snake.h? или у вас все в срр файлах?
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
08.10.2012, 17:40 3
Никто не подключает исходники друг в друга. Следует использовать заголовки. Пример:
C++
1
2
3
4
5
6
7
8
9
10
//snake.h:
#ifndef SNAKE_H
#define SNAKE_H
 
    //Здесь идут прототипы функций
    bool IsAlive();
    void Move(char direction);
    //...
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
//snake.cpp:
#include "snake.h"
#include "food.h"
 
//А здесь - их реализация
bool IsAlive() {
    //...
}
 
void Move(char dir) {
    //...
}
Аналогично для food.cpp и food.h.
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 17:46 4
Кот Ангенс, а я бы в
C++
1
2
3
4
5
6
7
8
9
10
//snake.h:
#ifndef SNAKE_H
#define SNAKE_H
#include "Food.h" // заголовок где описан class Food
    //Здесь идут прототипы функций
    bool IsAlive();
    void Move(char direction);
    //...
 
#endif
сделал бы потому , что как я могу объявить в заголовке Shake.h что то типа Food.h если не подключу его тут
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 18:02  [ТС] 5
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Никто не подключает исходники друг в друга. Следует использовать заголовки. Пример:
C++
1
2
3
4
5
6
7
8
9
10
//snake.h:
#ifndef SNAKE_H
#define SNAKE_H
 
    //Здесь идут прототипы функций
    bool IsAlive();
    void Move(char direction);
    //...
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
//snake.cpp:
#include "snake.h"
#include "food.h"
 
//А здесь - их реализация
bool IsAlive() {
    //...
}
 
void Move(char dir) {
    //...
}
Аналогично для food.cpp и food.h.
Как сделать тоже самое, только с классами? А то я не знаю, как делают отдельно объявление методов и их реализацию.
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 18:07 6
Ну вот пример такой
C++
1
2
3
4
5
6
7
8
9
10
 //OperationModels.cpp
#include "OperationModels.h"
 
 
//---------------------------------------------------------------------------
 
    TMMatrix Addition::calc(TMMatrix* matrx_1,TMMatrix* matrx_2){
         //тонкости реализации
            }
    }
C++
1
2
3
4
5
6
7
8
9
// OperationModels.h
#include "MatrixMath.h" // а тут описан класс TMMAatrix
 
 
 
class Addition : public  OperationBehavior{
    public:
    TMMatrix calc(TMMatrix* matrx_1,TMMatrix* matrx_2);
};
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 18:51  [ТС] 7
Цитата Сообщение от Nixy Посмотреть сообщение
Ну вот пример такой
C++
1
2
3
4
5
6
7
8
9
10
 //OperationModels.cpp
#include "OperationModels.h"
 
 
//---------------------------------------------------------------------------
 
    TMMatrix Addition::calc(TMMatrix* matrx_1,TMMatrix* matrx_2){
         //тонкости реализации
            }
    }
C++
1
2
3
4
5
6
7
8
9
// OperationModels.h
#include "MatrixMath.h" // а тут описан класс TMMAatrix
 
 
 
class Addition : public  OperationBehavior{
    public:
    TMMatrix calc(TMMatrix* matrx_1,TMMatrix* matrx_2);
};
Ну вот все сделал. Теперь хедеры ссылаются на друг друга, а не исходники. Только теперь ошибка другая возникла. Слишком много включаемых файлов: глубина = 1024
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:09 8
чтобы не переподключалось у тебя столько раз в одном из хедеров сделай так
например
C++
1
2
3
#ifndef SnakeH
 #include "Snake.h"
#endif
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
08.10.2012, 19:11 9
В хедеры надо добавить или это
C++
1
2
3
4
#ifndef SNAKE_H
#define SNAKE_H
 
#endif
или это
C++
1
#pragma once
Добавлено через 53 секунды
Цитата Сообщение от Nixy Посмотреть сообщение
сделал бы потому , что как я могу объявить в заголовке Shake.h что то типа Food.h если не подключу его тут
forward declaration
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:21 10
Цитата Сообщение от I.M. Посмотреть сообщение
В хедеры надо добавить или это
C++
1
2
3
4
#ifndef SNAKE_H
#define SNAKE_H
 
#endif
или это
C++
1
#pragma once
Добавлено через 53 секунды

forward declaration
да да я поправил себя ) или вы имеете ввиду , не что другое, название чего я забыл но оно точно есть)
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 19:24  [ТС] 11
Цитата Сообщение от Nixy Посмотреть сообщение
чтобы не переподключалось у тебя столько раз в одном из хедеров сделай так
например
C++
1
2
3
#ifndef SnakeH
 #include "Snake.h"
#endif
Простите, у меня как то не получается вставлять эти строчки куда надо. 2 хедера все ровно друг друга не находят.

Можете показать куда конкретно куда?

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
77
//====================================================
//Snake.h
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include "Food.h"
 
using namespace std;
using namespace System;
 
struct SnakeBody
{
    COORD Position;
};
 
class Snake
{
public:
    ConsoleKeyInfo Key; int Score; // Переменные нажатой клавиши и очков
    Border *border; // Указатель на объект границы
    Food *food; // Указатель на объект еды
    int Speed; // Переменная скорости змейки
    SnakeBody Body[100]; // Массив частей тела змейки
    int Lenght; // Переменная длины змейки
    int Direction; // Переменная направления змейки
    Snake(int X, int Y, Border *border, Food *food);
    // Конструктор змейки. В аргументах: координаты головы змейки, граница и еда
 
    int SetPos(int x, int y);
 
    int Start();
 
    void WriteScore(); // Вывести очки на экран
 
    void WriteSnake(); // Нарисовать змейку
 
    void WipeSnake(); // Стереть змейку
 
    void Write(); // Нарисовать часть тела
 
 
    void WriteXY(int x, int y); // Нарисовать часть тела
    
    void Wipe(); // Стереть часть тела
 
 
    void WipeXY(int x, int y); // Стереть часть тела по координатам
 
    void CursorToHead(); // Переместить курсор на голову ( чтобы не мешался :) )
 
};
//=================================================================
//Food.h
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include "Snake.h"
 
using namespace std;
using namespace System;
 
class Food
{
public:
    COORD Position;
    Border *border;
    Snake *snake;
int Food::random(int x, int y); // Функция для генерации случайного числа в диапазоне от x до y
 
Food::Food(Border *border, *snake);
 
void Food::setPos(); // Функция для изменения позиции еды
 
void WriteXY(int x, int y); // Функция для рисования еды
};
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:29 12
в Shanke.h добавь
C++
1
#define SnakeH
в Food.h вместо
C++
1
#include "Shake.h"
запиши
C++
1
2
3
#ifndef SnakeH 
#include "Snake.h"
#endif
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 19:35  [ТС] 13
Цитата Сообщение от Nixy Посмотреть сообщение
в Shanke.h добавь
C++
1
#define SnakeH
в Food.h вместо
C++
1
#include "Shake.h"
запиши
C++
1
2
3
#ifndef SnakeH 
#include "Snake.h"
#endif
Не знаю почему, но даже так они не распознают друг друга
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:38 14
а чо пишет?
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 19:41  [ТС] 15
Цитата Сообщение от Nixy Посмотреть сообщение
а чо пишет?
В Food.h пишет

1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(18): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(18): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(18): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(21): error C2059: синтаксическая ошибка: *
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(14): error C2011: Food: переопределение типа "class"
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
08.10.2012, 19:44 16
Цитата Сообщение от Nixy Посмотреть сообщение
в Shanke.h добавь
C++
1
#define SnakeH
в Food.h вместо
C++
1
#include "Shake.h"
запиши
C++
1
2
3
#ifndef SnakeH 
#include "Snake.h"
#endif
Не так.
В snake.h пишите так:
C++
1
2
#pragma once//это первая строка файла!
//остальной текст
В остальных *.h файлах аналогично
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:46 17
I.M., разве мой макрос рабоать не будет?
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
08.10.2012, 19:49 18
Nixy, будет, но раз уж учите использовать макросы для include guard, то хотя бы пишите их в нужном месте. ТС же новичек. Сейчас неверно запомнит и будет долго так писать.
Или в своих проектах вы так же все хедеры подключаете, обрамляя их дефайнами?
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:59 19
Цитата Сообщение от I.M. Посмотреть сообщение
Nixy, будет, но раз уж учите использовать макросы для include guard, то хотя бы пишите их в нужном месте. ТС же новичек. Сейчас неверно запомнит и будет долго так писать.
Или в своих проектах вы так же все хедеры подключаете, обрамляя их дефайнами?
за меня RAD Studio дефайны раставила ) , я сам новичок , просто знаю что это работает
0
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 57
08.10.2012, 20:01  [ТС] 20
Цитата Сообщение от I.M. Посмотреть сообщение
Nixy, будет, но раз уж учите использовать макросы для include guard, то хотя бы пишите их в нужном месте. ТС же новичек. Сейчас неверно запомнит и будет долго так писать.
Или в своих проектах вы так же все хедеры подключаете, обрамляя их дефайнами?
С прагмой уанс почти тоже самое

1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(16): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(16): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(16): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\i.main\documents\visual studio 2010\projects\oldsnake\snake\Food.h(19): error C2059: синтаксическая ошибка: *
0
08.10.2012, 20:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2012, 20:01
Помогаю со студенческими работами здесь

Объединить исходные файлы в проект и скомпилировать
помогите пожалуйста, с реализацией, не получается объединить, подскажите как и что мне делать чтобы...

Исходные файлы учебного пособия по solidworks 2010
Где можно найти исходные файлы учебного пособия по solidworks 2010?

Какие исходные файлы должны быть в проекте на С#?
Добрый день, мой вопрос может показаться странным, однако: какие исходные файлы должны быть если...

Создать новый файл, объединив исходные текстовые файлы
даны текстовые файлы Name1 и Name2 .создать Name3 файл объединив Name1 и Name2 текстовые файлы ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru