Доступ к объекту из другого класса c ++

0

Я медленно изучаю c++, хотя при разработке моей программы у меня возникли проблемы с попыткой доступа и создания объекта Ive. Мой объект создается на странице с именем source.cpp с

Tilemap background;

У меня есть другой заголовочный файл, который в tern вызывает функцию с доступом к "фону", файл называется "player.cpp", однако я не могу определить, как его определить. Ive включил заголовочный файл с классом tilemap, но поскольку объект создан в другом месте, я не знаю, как его ссылать. Сегодня Google не будет моим другом, и мой поиск ничего не принес.

  • 2
    Код поможет выразить проблему здесь. Наряду с точными ошибками компилятора ./
  • 0
    в player.cpp использовать extern Tilemap background;
Теги:
class
object
function

3 ответа

3
Лучший ответ

Линия

Tilemap background;

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

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

// In another .cpp file
extern Tilemap background;

void f()
{
    background.something();
}
  • 0
    Так просто? Вы избавили меня от множества царапин на голове, в этом есть смысл, но я пробовал все, чтобы это работало часами, благодаря этому простому ответу я могу значительно улучшить части своего кода. Большое спасибо.
1
Tilemap background;

помещенный в глобальную область (скажем, где-то в начале вашего файла source.cpp) объявляет глобальную переменную, доступную только в пределах одного и того же модуля компиляции по умолчанию (в данном случае, вероятно, только внутри source.cpp). В player.cpp компилятор не знает, что существует переменный background.

Одним из решений может быть:

extern Tilemap background;

в вашем player.cpp чтобы компилятор знал, что существует глобальная переменная типа Tilemap определенная где-то в другом месте.

Однако я считаю, что лучше избегать использования глобальных переменных такого типа и пытаться "распространять" (pass) переменные/объекты в форме аргументов при вызове некоторых функций-членов ("методы"). В конце концов, связь между объектами - это то, что программирует OO... (я бы представил конкретный пример, если бы знал контекст этого класса/если вы поделились некоторым кодом...)

0

Хорошо, поэтому вы изучаете 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++, она научит почти все, что вам нужно знать, чтобы правильно использовать язык

  • 0
    Этот тип отложенной инициализации иногда полезен, и он избегает некоторых проблем со статическим построением объектов, но у него также есть свои проблемы, особенно если ваша программа многопоточная - она не поточно-ориентированная.
  • 0
    Тем не менее решение, которое вы предоставили, ведет к неопределенному поведению и не рекомендуется. Безопасность потоков - другая проблема, и ни одно из решений не является хорошим в этом отношении. Все еще использовать глобалы, как вы говорите, совершенно неправильно. Вы не должны стрелять себе в ногу только потому, что C ++ позволяет вам это делать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню