Проблемсы с реализацией выноса классов в файлы

SFML и C++ Уроки \ Разработка игр Форумы SFML System, Window и другие вопросы Проблемсы с реализацией выноса классов в файлы

В этой теме 13 ответов, 4 участника, последнее обновление MatrixDeity MatrixDeity 3 года/лет, 5 мес. назад.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • #1082

    newUser11
    Участник
    Сообщений:10

    Зарегистрирован:
    19.06.2015

    Репутация:4

    Всем привет. Знаю, что подобная тема уже была, но мне не помогла она, поэтому  создал еще одну похожую, сори.
    Решил вынести классы в отдельные файлы.
    Возникла проблема с подключением map.h
    error C2065: ‘TileMap’ : undeclared identifier
    Вот как я подключаю файлы

    player.h

    #include <SFML/Graphics.hpp>

    using namespace sf;

    player.cpp

    #include “player.h”
    и дальше все функции.

    main.cpp
    #include <SFML/Graphics.hpp>
    #include “map.h”
    #include “view.h”
    #include “player.h”
    using namespace sf;

    Если полключать map.h в player.h, а в main.cpp  убрать, то fatal error LNK1169: one or more multiply defined symbols found

    #1091
    +1
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Привет. Хорошо бы увидеть полный листинг. Чтобы иметь полную картину мира, так сказать :-)

    P.S. Пожалуйста, используй теги форматирования для оформления кода. Это значительно повышает удобочитаемость поста.

    #1092

    newUser11
    Участник
    Сообщений:10

    Зарегистрирован:
    19.06.2015

    Репутация:4

     

    #1093
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Во-первых, при описании методов внутри тела класса, имя класса не нужно добавлять перед именем метода. Т.е.:

    Во-вторых, проблема возникла из-за того, что переменная TileMap не видна в модулях player.h и player.cpp, где происходит обращение к ней. Так что вариант добавить #include “map.h” в player.h правильный. Очевидно, что проблема в map.h. Напиши его содержимое.

    #1095

    newUser11
    Участник
    Сообщений:10

    Зарегистрирован:
    19.06.2015

    Репутация:4

    Ок.

    #1096
    +1
    kochegar
    kochegar
    Участник
    Сообщений:6

    Зарегистрирован:
    16.05.2015

    Репутация:5

    вижу неправильный слеш в объявлении sfml  \  Graphics

    #1097
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Да, слеш в другую сторону. Иначе имя библиотеки будет указано неверно, и, как следствие, тип String будет неизвестен компилятору. Отсюда и ошибка, мол, непонятно что за объект TileMap.

    Попробуй исправить ошибки, которые уже были указаны в топике. Потом отпишись, скомпилировалось ли :-)

    #1098

    newUser11
    Участник
    Сообщений:10

    Зарегистрирован:
    19.06.2015

    Репутация:4

    Исправил, ошибка такая же, указывает на 64 строку в player.cpp, а вообще, мне такой слеш ставит студия. Когда приписываешь скобку, а потом курсором выбираешь там из выпадающего списка.

    #1099
    +2
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Так, в общем, я не поленился и закодил то же, что и у тебя.

    На счет слеша: да, я ошибся – в map.h слеш правильный, а вот в main.cpp и player.h – нет (поменяй на обратный, по аналогии с map.h, т.е. правильно: SFML\Graphics.hpp).

    А вот с TileMap не совсем все ясно. Я решил проблему объявив массив статическим, и все заработало:

    map.h

    А у автора урока этот код точно без static работает? Интересно, что Павел скажет :-)

    #1100
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    Да, работает. Это глобальная переменная, объявленная вне.

    #1101
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Это странно. Следуя этому коду можно обнаружить многократное объявление TileMap (сначала в main.cpp, а потом в player.cpp). Давайте рассмотрим схему проекта:

    Есть два исходника: main.cpp и player.cpp. В оба подключаем player.h, который содержит map.h. таким образом видим, что map.h подставляется в ОБА cpp. Следовательно, компилятор видит, что переменная TileMap объявляется дважды и говорит нам об этом.

    #1102
    kochegar
    kochegar
    Участник
    Сообщений:6

    Зарегистрирован:
    16.05.2015

    Репутация:5

    нужна конструкция которая делает включение в фаил только один раз. забыл как называется…

    #1103
    +3
    kochegar
    kochegar
    Участник
    Сообщений:6

    Зарегистрирован:
    16.05.2015

    Репутация:5

    http://cppstudio.com/post/443/

     

    <code class=”c comments”>// структура препроцессорной обёртки
    <code class=”c preprocessor”>#ifndef /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/
    <code class=”c preprocessor”>#define /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/
    <code class=”c comments”>// определение класса
    <code class=”c preprocessor”>#endif /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/

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

    вот. нашел. надеюсь поможет)

    #1112
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Использование include guard или pragma once тут не поможет, к сожалению. Хотя они все равно желательны во всех хэдерах.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)

Для ответа в этой теме необходимо авторизоваться.