Как эта частная переменная «не объявлена ​​в этой области»? - PullRequest
6 голосов
/ 20 января 2011

В настоящее время я пытаюсь узнать больше об объектно-ориентированном дизайне на C ++ (знаком с Java) и пробираюсь к некоторым стенам.Проект, который я пытаюсь собрать, чтобы изучить эти принципы в игре, построенной с использованием SFML для графики и звука.У меня есть следующие два файла.

WorldObject.h

#ifndef WORLDOBJECT_H
#define WORLDOBJECT_H
#include <SFML/Graphics.hpp>
#include <string>
#include "ImageManager.h"

class WorldObject
{
 private:
  sf::Sprite _sprite;
  void SetImagePath(std::string path);
  sf::Sprite GetGraphic();
};
#endif

WorldObject.cpp

#include "WorldObject.h"
void WorldObject::SetImagePath(std::string path)
{
  _sprite.SetImage(*gImageManager.getResource(path));
}

sf::Sprite GetGraphic()
{
  return _sprite;
}

Iне вижу проблем ни с одним из них, и все же, когда я пытаюсь скомпилировать их, я получаю следующую ошибку от g ++:

WorldObject.cpp: In function ‘sf::Sprite GetGraphic()’:
WorldObject.cpp:9: error: ‘_sprite’ was not declared in this scope
make: *** [WorldObject.o] Error 1

Чего мне не хватает в этом коде?Попытка понять, как правильно настроить иерархию наследования, до сих пор вызывала большинство проблем в разработке игры, но я знаю, что это в первую очередь связано с тем, что я более приспособлен к использованию модели наследования Java, а не множественного числа в C ++.Модель наследования.

Ответы [ 5 ]

11 голосов
/ 20 января 2011

Функция GetGraphics, которую вы определяете в WorldObject.cpp, не является членом класса WorldObject.Используйте

sf::Sprite WorldObject::GetGraphic()
{
  return _sprite;
}

вместо

sf::Sprite GetGraphic()
{
  return _sprite;
}

Обратите внимание, что компилятор C ++ жалуется только на отсутствие WorldObject::GetGraphic, если эта функция вызывается откуда-то в вашей программе.

2 голосов
/ 20 января 2011

sf::Sprite GetGraphic() неверен, он объявляет глобальную GetGraphic функцию.Поскольку GetGraphic является функцией class WorldObject, оно должно быть sf::Sprite WorldObject::GetGraphic().

0 голосов
/ 20 января 2011
// `GetGraphic()` is a member function of `WorldObject` class. So, you have two options to correct-
//Either define the functionality of `GetGraphic()` in the class definition itself. 

#ifndef WORLDOBJECT_H
#define WORLDOBJECT_H
#include <SFML/Graphics.hpp>
#include <string>
#include "ImageManager.h"

class WorldObject
{
    private:
    sf::Sprite _sprite;
    void SetImagePath(std::string path);
    sf::Sprite GetGraphic()  // Option 1
    {
         return _sprite;
    }
};
#endif

//When providing the member function definition, you need to declare that it is in class scope.  
// Option 2 => Just prototype in class header, but definition in .cpp
sf::Sprite WorldObject::GetGraphic() 
{  
    return _sprite;  
}
0 голосов
/ 20 января 2011

Я полагаю, вы хотите иметь:

sf :: Sprite WorldObject :: GetGraphic ()

не

sf :: Sprite GetGraphic ()

в WorldObject.cpp

0 голосов
/ 20 января 2011

Я не сделал много C ++, но я думаю, что вам нужно WorldObject::GetGraphic вместо GetGraphic в WorldObject.cpp?

...