Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Aspirin
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
#1

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

13.08.2014, 23:18. Просмотров 386. Ответов 4
Метки нет (Все метки)

Решил написать змейку с использование 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);
}
Если так делать нельзя, как можно по другому?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 23:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли объявлять объекты в заголовочном файле? (C++):

Можно ли объявлять объекты в заголовочном файле?
main.cpp #include &quot;aa.h&quot; int main(int argc, char** argv){ return 0; }...

Как правильно объявлять статические константные объекты в классе?
В классе надо объявить статичные константные строки. Типа class A { public:...

С - С++ enum в заголовочном файле
ситуация примерно такая компилятор gcc есть заголовочный файл в нем...

Setlocale в заголовочном файле
main.cpp #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;cstring&gt;...

Функции в заголовочном файле
Почему нельза задать тело функции в .h файле??? например(header.h): #ifndef...

Структура в заголовочном файле
Код .h: // file.h #pragma once struct Worker { char name; int cdate;...

4
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
14.08.2014, 04:32 #2
Аналогичный вопрос http://www.cyberforum.ru/cpp-beginners/thread1241231.html
PS Лучше не использовать глобальные переменные.
2
Aspirin
29 / 6 / 2
Регистрация: 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 не компилится?
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,208
Завершенные тесты: 1
14.08.2014, 21:11 #4
extern означает, что переменная объявлена где-то в другом месте
(напрашивается аналогия с прототипами функций ( void f(); ).
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
14.08.2014, 21:55 #5
Цитата Сообщение от Aspirin Посмотреть сообщение
Так и должно быть? В данном случае я правильно сделал? И почему, если оставить везде extern не компилится?
Так и должно быть. В той теме последний пост и там все разжевано, в том числе и ответ на этот вопрос Почитай.
0
14.08.2014, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 21:55
Привет! Вот еще темы с решениями:

Переменная в заголовочном файле
//qwer.h class qwer { public: extern int a; }; //qwer.cpp #include...

Обьявление идентификатора в заголовочном файле
Добрый день, подскажите как исправить ошибку Ошибка C2065 Triangle:...

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

Объявление константы в заголовочном файле
Как объявить константу и массив в заголовочном файле? Map.h #pragma once...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru