Проблема, объявляющая объект внешнего класса - PullRequest
2 голосов
/ 18 января 2012

Позвольте мне начать с того, что я интенсивно искал ответы в Google, а точнее здесь.

Дело в том, что я действительно (по крайней мере, мне так кажется) нашел людей с похожими проблемами, хотя ответ на них дал мне еще одну проблему.

Я использую Visual Studio 2010 Express и работаю с SFML-библиотекой (хотя я не думаю, что эта последняя часть актуальна)

Итак, вот оно:

У меня есть исходный файл player.cpp, который содержит класс Player, и у меня есть файл заголовка (включенный во все исходные файлы) с именем cc.h (команда и управление), в котором содержатся все необходимые включения и внешние переменные / функции. Необходимый код можно суммировать следующим образом:

Player.cpp:

#include "cc.h"
class Player
{
private:

//some variables here

public:

//more variables and some functions

}john;//example instance

cc.h:

#pragma once

//some #includes
//some externs

extern Player john;

Теперь в cc.h слово Player подчеркнуто как ошибка, говоря, что это неопределенный идентификатор , но только иногда, иногда Visual Studio не помечает это как ошибку, а распознает его как класс, но не распознает Джона как объект / экземпляр (я надеюсь, это так называется) того же класса. Кроме того, при компиляции первой ошибки, которую он показывает, это «error C2146: syntax error : missing ';' before identifier 'john'» в строке внешнего объявления john, в cc.h, что, по-видимому (для меня) не имеет никакого смысла.

Ответы [ 3 ]

6 голосов
/ 18 января 2012

Глобальное объявление в cc.h не поможет вам, я полагаю - потому что вы объявляете его для доступа к нему откуда-то еще (кроме Player.cpp), но для этого вам нужны сигнатуры методов - как только вы захотитечтобы получить доступ к john из другого места и, таким образом, включить Player.cpp, вы получите дубликаты символов.

Пожалуйста, рассмотрите возможность создания файла Player.h, в котором объявляются только сигнатуры классов и методов - например:

#ifndef PLAYER_H_
#define PLAYER_H_

class Player
{
     void doSomething();
};
#endif

и добавьте это в cc.h:

#include <Player.h>
extern Player john;

и в вашем Player.cpp

#include <Player.h>

Player john;

void Player::doSomething()
{
    //...
}

Это гарантирует, что сигнатуры Player известны идействительный экземпляр объявлен глобально.

3 голосов
/ 18 января 2012

Вам нужно поместить определение вашего класса Player в заголовочный файл, прежде чем объявить переменную extern. В противном случае компилятор не знает, что такое Player.

Я предлагаю что-то вроде этого:

player.h

#ifndef PLAYER_H_
#define PLAYER_H_

class Player {
    ...
};

#endif

player.cpp

#include "player.h"

Player john;

cc.h

#ifndef CC_H_
#define CC_H_

#include "player.h"

extern Player john;

#endif
0 голосов
/ 18 января 2012
  1. Вам необходимо определить класс Player в вашем заголовочном файле
  2. Используйте extern для использования переменной, которая имеет внешнюю связь и уже определена в каком-то другом файле.

Например: у вас есть файл a.cpp, а внутри этого файла есть глобальная переменная Player p.Если вы хотите использовать точно такой же экземпляр p из Player в файле c.cpp, то внутри файла c.cpp вы пишете extern Player p.

Надеюсь, я дал понять.

...