2016-04-08 39 views
0

Forehand içerir Ben C++ programlama için oldukça yeni ve çerçeve olarak Ogre3D kullanıyorum bahsetmek istiyorum (okul proje nedenlerinden dolayı). Oyuncu sınıfında OyunObject sınıfından miras alan bir sınıf var. Aşağıdaki hata ile karşı karşıya ediyorum projeyi inşa etmeye çalışırken:Tanımsız temel sınıf, mevcut

Error C2504 'GameObject' : base class undefined - player.h (9)

GameObject standartlarında bir oyuncu sınıfının başlık dosyası içinde tanımlanmamış ima ediyorum hangisi. Ancak aslında GameObject başlık dosyasını Player'ınki ile ekledim (aşağıdaki kod). Kodda olup bitenler dahil olmak üzere farkındayım. Şimdi birkaç gündür bu sorun üzerinde Stumped oldum

compiler errors

: Ben dışarıda bırakın Ancak eğer bu ben oluşmadan nasıl veya neden emin değilim hangi farklı hataların bütün bir listesini almak içerir İnternet hakkında henüz bir çözüm bulamadık (CPlusPlus makalesi ağırlıklı olarak danışmanlık yapıyorum: http://www.cplusplus.com/forum/articles/10627/).

Aşağıda listelenen başlık dosyalarının kaynak dosyaları yalnızca ilgili üstbilgi dosyalarını içerir.

Player.h

#pragma once 

#ifndef __Player_h_ 
#define __Player_h_ 

#include "GameObject.h" 

class Player : public GameObject { 
    // ... Player class interface 
}; 
#endif 

GameObject.h

#pragma once 

#ifndef __GameObject_h_ 
#define __GameObject_h_ 

#include "GameManager.h" 

// Forward declarations 
class GameManager; 

class GameObject { 
// ... GameObject class interface 
}; 
#endinf 

GameObject başlık görülebileceği gibi GameManager içerir.

main.h ile

// Include guard 
#ifndef __Main_h_ 
#define __Main_h_ 

// Includes from Ogre framework 
#include "Ogre.h" 
using namespace Ogre; 

// Includes from projet headers 
#include "BaseApplication.h" 
#include "GameManager.h" 

// forward declarations 
class GameManager; 

class Main : public BaseApplication 
{ 
// ... Main interface 
}; 
#endif 

: başlık dosyası aşağıdaki gibi görünür Ana sınıfı yoktur ait

GameManager.h

#pragma once 

// Include guard 
#ifndef __GameManager_h_ 
#define __GameManager_h_ 

// Includes from project 
#include "Main.h" 
#include "Constants.h" 
#include "GameObject.h" // mentioned circular includes 
#include "Player.h" // " 

// Includes from system libraries 
#include <vector> 

// Forward declarations 
class GameObject; 

class GameManager { 
// ... GameManager interface 
}; 
#endif 

top için Konuyla ilgili yaptığım tüm okumalar ve aynı hataya sahip diğer bireyler olurdum. Bunu anlamaya ama henüz boşuna. Umarım birisi bana yardım etmek için zaman harcayabilir ve herhangi bir hatalı kod veya konvansiyona işaret edebilir.

+0

Sınıf tanımlarınızdan sonra '' 'var mı? Onlar eksik – vu1p3n0x

+0

Benim kötü, evet sınıf tanımları yarı-kolon ile biter. Buna göre ana yazıyı düzenleyeceğim. – Stephan

+1

Her ikisi de sınıf tanımını ve bu sınıfı ileriye bildirmeyi içeren bir anlam yoktur. İleri bildirme yeterliyse, içeriklerini kaldırın. Sınıf tanımına ihtiyacınız varsa, bildirimi kaldırın. – molbdnilo

cevap

0

Sorunu çözmenin en kolay yolu, üstbilgi dosyalarını eklemek için modelinizi değiştirmektir. B.h, B.h'de (doğrudan) kullanılan bir sembolü tanımlarsa, A.h dosyasını yalnızca B.h içermelidir. Ayrıca, genellikle bir üstbilgi dosyasında bir kullanma cümleciği koymak kötü bir fikirdir - istemci kodunun programcısı bu kararlılığı sağlar. Kesinlikle gerekli olmadıkça, sınıflar için ileriye dönük beyanlar; "GameManager.h" nin hemen ardından GameManager sınıfına gerek yok. Kodda başka bir şeylerin yanlış olduğundan şüpheleniyorum, ancak sınıfların ileriye yönelik beyanları bu sorunu gizliyor. İçerikleri değiştirmek sorunu çözmezse, "en basit" üstbilgiyi (başkalarına bağımlı olmayan) içeren tek bir .cpp dosyasıyla başlayın ve tam kapsam kümesine göre oluşturun.

+0

Başlığı istediğiniz zaman başlık dosyalarına eklemekten kaçının. Bunun yerine ileri bildirimi kullanın. – Ceros

+0

Tüm içerme ve bildirimleri temizleme yaklaşımınızla uğraştı ve tüm eksik başvurular adım adım dahil. Sonunda, hem Oyuncu hem de GameObject'in sorun olduğu GameManager'a dahil oldu. Bu kodlarda henüz pratik kullanmadığım için bunları kaldırdım ve proje inşa edebilirdi. Bir yedekleme yaptım ve daha iyi bir başlık düzgünlüğü oluşturmaya başlayacağım. Teşekkürler! – Stephan