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

Можно ли объявлять объекты в заголовочном файле? - C++

Восстановить пароль Регистрация
 
Aspirin
29 / 6 / 0
Регистрация: 05.10.2012
Сообщений: 117
13.08.2014, 23:18     Можно ли объявлять объекты в заголовочном файле? #1
Решил написать змейку с использование OpenGL. Сначала написал все в одном файле, все работало, решил сделать по красивее и распихать по хедерам. Сразу вопрос: Можно ли объявлять объекты в заголовочном файле?
Из-за этого похоже у меня и ошибки:
C++
1
2
3
4
5
6
7
8
9
1>Food.obj : error LNK2005: "class Block * blocks" (?blocks@@3PAVBlock@@A) already defined in Block.obj
1>Food.obj : error LNK2005: "class Food food" (?food@@3VFood@@A) already defined in Block.obj
1>Food.obj : error LNK2005: "class Snake snake" (?snake@@3VSnake@@A) already defined in Block.obj
1>main.obj : error LNK2005: "class Block * blocks" (?blocks@@3PAVBlock@@A) already defined in Block.obj
1>main.obj : error LNK2005: "class Food food" (?food@@3VFood@@A) already defined in Block.obj
1>main.obj : error LNK2005: "class Snake snake" (?snake@@3VSnake@@A) already defined in Block.obj
1>Snake.obj : error LNK2005: "class Block * blocks" (?blocks@@3PAVBlock@@A) already defined in Block.obj
1>Snake.obj : error LNK2005: "class Food food" (?food@@3VFood@@A) already defined in Block.obj
1>Snake.obj : error LNK2005: "class Snake snake" (?snake@@3VSnake@@A) already defined in Block.obj
Я так сделал, т.к. некоторым классам нужен доступ к объектам других классов.
Вот некоторые файлы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Constants.h
#include "Block.h"
#include "Snake.h"
#include "Food.h"
 
#ifndef CONSTANTS_H
#define CONSTANTS_H
 
const int n = 16;                   //rows
const int m = 16;                   //columns
const int size_cell = 25;           //size x size of one cell
const int width = m*size_cell;      //width of window
const int height = n*size_cell;     //height of window
 
Snake   snake;
Block   blocks[width*height];           //body of snake
Food    food;
 
#endif CONSTANTS_H
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
//Food.cpp
#include "Food.h"
#include "Constants.h"
#include <cstdlib>
#include <time.h>
#include <glut.h>
 
void Food::spawn()
{
    srand(time(NULL));
    x = (rand() % m)*size_cell;
    y = (rand() % n)*size_cell;
    for (int i = 0; i < snake.size; i++)
    {
        if ((x == blocks[i].x) && (y == blocks[i].y))
            spawn();
    }
}
 
void Food::draw()
{
    glColor3f(1.0, 0.0, 0.0);
    glRectd(x, y, x + size_cell, y + size_cell);
}
Если так делать нельзя, как можно по другому?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 23:18     Можно ли объявлять объекты в заголовочном файле?
Посмотрите здесь:

C++ Переменная в заголовочном файле
Объявление поля класса в заголовочном файле C++
C++ Функции в заголовочном файле
C++ Объявление класса в заголовочном файле
C++ Как подключить библиотеки в заголовочном файле?
Можно ли объявлять объекты в заголовочном файле? C++
C++ Сортировка пузырьком функцией в заголовочном файле
C++ Setlocale в заголовочном файле
C++ Создание структуры в заголовочном файле
C++ Объявление константы в заголовочном файле
C++ Не подключается namespace в заголовочном файле
Как правильно объявлять статические константные объекты в классе? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
14.08.2014, 04:32     Можно ли объявлять объекты в заголовочном файле? #2
Аналогичный вопрос Можно ли объявлять объекты в заголовочном файле?
PS Лучше не использовать глобальные переменные.
Aspirin
29 / 6 / 0
Регистрация: 05.10.2012
Сообщений: 117
14.08.2014, 20:50  [ТС]     Можно ли объявлять объекты в заголовочном файле? #3
С extern не совсем понял, но "методом тыка" все заработало. В Constants.h прописал:
C++
1
2
3
extern class Snake   snake;
extern class Block   blocks[width*height];           //body of snake
extern class Food    food;
В остальных файлах где требовались эти объекты прописал
C++
1
extern Snake   snake и т.д.
НО! Надо, чтобы хотя бы в одном файле определение объекта каждого из классов было без extern. Иначе выдает ошибку:
C++
1
error LNK2001: unresolved external symbol
Так и должно быть? В данном случае я правильно сделал? И почему, если оставить везде extern не компилится?
zss
Модератор
Эксперт С++
 Аватар для zss
6053 / 5656 / 1828
Регистрация: 18.12.2011
Сообщений: 14,444
Завершенные тесты: 1
14.08.2014, 21:11     Можно ли объявлять объекты в заголовочном файле? #4
extern означает, что переменная объявлена где-то в другом месте
(напрашивается аналогия с прототипами функций ( void f(); ).
DrOffset
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
14.08.2014, 21:55     Можно ли объявлять объекты в заголовочном файле? #5
Цитата Сообщение от Aspirin Посмотреть сообщение
Так и должно быть? В данном случае я правильно сделал? И почему, если оставить везде extern не компилится?
Так и должно быть. В той теме последний пост и там все разжевано, в том числе и ответ на этот вопрос Почитай.
Yandex
Объявления
14.08.2014, 21:55     Можно ли объявлять объекты в заголовочном файле?
Ответ Создать тему
Опции темы

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