Я медленно изучаю c++, хотя при разработке моей программы у меня возникли проблемы с попыткой доступа и создания объекта Ive. Мой объект создается на странице с именем source.cpp с
Tilemap background;
У меня есть другой заголовочный файл, который в tern вызывает функцию с доступом к "фону", файл называется "player.cpp", однако я не могу определить, как его определить. Ive включил заголовочный файл с классом tilemap, но поскольку объект создан в другом месте, я не знаю, как его ссылать. Сегодня Google не будет моим другом, и мой поиск ничего не принес.
Линия
Tilemap background;
написанное в области файлов (т.е. не внутри функционального блока), является определением глобальной переменной. Он выделяет хранилище в глобальных данных для переменной, называемой фоном.
Если вы хотите обратиться к этому объекту из другого исходного файла C++, вам нужно сначала объявить переменную, чтобы компилятор знал ее тип.
// In another .cpp file
extern Tilemap background;
void f()
{
background.something();
}
Tilemap background;
помещенный в глобальную область (скажем, где-то в начале вашего файла source.cpp
) объявляет глобальную переменную, доступную только в пределах одного и того же модуля компиляции по умолчанию (в данном случае, вероятно, только внутри source.cpp
). В player.cpp
компилятор не знает, что существует переменный background
.
Одним из решений может быть:
extern Tilemap background;
в вашем player.cpp
чтобы компилятор знал, что существует глобальная переменная типа Tilemap
определенная где-то в другом месте.
Однако я считаю, что лучше избегать использования глобальных переменных такого типа и пытаться "распространять" (pass) переменные/объекты в форме аргументов при вызове некоторых функций-членов ("методы"). В конце концов, связь между объектами - это то, что программирует OO... (я бы представил конкретный пример, если бы знал контекст этого класса/если вы поделились некоторым кодом...)
Хорошо, поэтому вы изучаете C++, затем изучаете хорошие практики с самого начала и избегаете ловушек C++. Объявление и использование глобальных объектов C++ таким образом может привести к очень неприятному поведению и длительным сеансам отладки, потому что вы не можете быть уверены, что фон глобального объекта, объявленный в глобальной глобальной области, инициализируется и правильно строится, когда вы используете его в другом файле, Когда вы используете такой объект, позвольте ему B, в другом глобальном объекте A в другом файле вы не можете быть уверены, что B инициализирован до A, и это приводит к очень неприятным ошибкам или если вам повезет сбой. Затем решение: сделайте объект фоном локальным статическим объектом, то есть локальным для такой функции:
TileMap& getBackground() {
static TileMap background; //use of "camel case" for the class name
return background; //return a reference to it
}
Это. В любом месте, где вы хотите использовать фон, просто вызовите getBackground(). В первый раз, когда вы его назовете, фоновая локальная статика будет инициализирована и будет полезна.
Некоторые скажут, что этот метод связан с шаблоном проектирования singleton, но это не мое намерение здесь, это просто правильный способ использования глобальных объектов, если вам это абсолютно необходимо. C++ - отличный язык, особенно с выпуском C++ 11, но у него есть некоторые подводные камни, о которых вам нужно знать. Сделайте себе одолжение: возьмите копию Effetive C++, она научит почти все, что вам нужно знать, чтобы правильно использовать язык
extern Tilemap background;