7

私は現在、C ++(Javaに精通している)でのオブジェクト指向設計についてもっと学びたいと思っており、いくつかの壁にぶつかっています。グラフィックとオーディオにSFMLを使用して構築されたゲームでこれらの原則を学ぶために私がまとめようとしているプロジェクト。次の2つのファイルがあります。

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;
}

これらのいずれにも問題はありませんが、コンパイルしようとすると、g++から次のエラーが発生します。

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

このコードには何が欠けていますか?継承階層を設定する適切な方法を理解しようとすると、これまでのところゲームの開発で最も多くの問題が発生していますが、それは主に、C++の多重ではなくJavaの継承モデルを使用するように条件付けられているという事実が原因であることを知っています継承モデル。

4

5 に答える 5

13

GetGraphicsで定義する関数WorldObject.cppは、WorldObjectクラスのメンバーではありません。使用する

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

それ以外の

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

C ++コンパイラはWorldObject::GetGraphic、この関数がプログラムのどこかから呼び出された場合にのみ、欠落について文句を言うことに注意してください。

于 2011-01-20T05:50:09.047 に答える
2

sf::Sprite GetGraphic()正しくありません。グローバルGetGraphic関数を宣言しています。GetGraphicはの関数なので、class WorldObjectである必要がありますsf::Sprite WorldObject::GetGraphic()

于 2011-01-20T05:49:38.827 に答える
0

私はあまりC++を実行していませんが、WorldObject.cppWorldObject::GetGraphicの代わりに必要だと思いますか?GetGraphic

于 2011-01-20T05:50:31.543 に答える
0

私はあなたが持っていることを意味すると信じています:

sf :: Sprite WorldObject :: GetGraphic()

いいえ

sf :: Sprite GetGraphic()

WorldObject.cppで

于 2011-01-20T05:56:32.200 に答える
0
// `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;  
}
于 2011-01-20T05:58:20.760 に答える