C tipi bir hata adı yazmıyor
İki sınıf altında olarak ilan ediyorum:
class User
{
public:
MyMessageBox dataMsgBox;
};
class MyMessageBox
{
public:
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message> *dataMessageList;
};
Bu gcc kullanarak derlemek için çalıştığınızda, aşağıdaki hata verir: 'MyMessageBox bir tür adı değildir.
CEVAP
Derleyici sınıf User
derler MyMessageBox
hattı MyMessageBox
geldiğinde henüz belirlenmedi. Var hiç bir fikrin yok, olamaz sınıfı üyesi ne demek olduğunu anlıyorum.
MyMessageBox
tanımlanmış olduğundan emin olunöncebir üyesi olarak kullanın. Bu tanım sırasını ters çevirerek çözüldü. User
MyMessageBox
adı User
tanımı yukarıda MyMessageBox
tanımlı olmayacak taşırsanız! ancak, döngüsel bir bağımlılık var:
Ne yapabilirimileri bildirinUser
; yani, beyan ama belirlemez. Derleme sırasında ilan etti ama tanımlanmamış bir türü olarak adlandırılırtamamlanmamış bir tür.
Daha basit bir örnek düşünelim:
struct foo; // foo is *declared* to be a struct, but that struct is not yet defined
struct bar
{
// this is okay, it's just a pointer;
// we can point to something without knowing how that something is defined
foo* fp;
// likewise, we can form a reference to it
void some_func(foo& fr);
// but this would be an error, as before, because it requires a definition
/* foo fooMember; */
};
struct foo // okay, now define foo!
{
int fooInt;
double fooDouble;
};
void bar::some_func(foo& fr)
{
// now that foo is defined, we can read that reference:
fr.fooInt = 111605;
fr.foDouble = 123.456;
}
İleri User
, MyMessageBox
ilan hala bir işaretçi veya başvuru formu
class User; // let the compiler know such a class will be defined
class MyMessageBox
{
public:
// this is ok, no definitions needed yet for User (or Message)
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message>* dataMessageList;
};
class User
{
public:
// also ok, since it's now defined
MyMessageBox dataMsgBox;
};
Sanaolamazsöz, bir sınıf üyesi bir tanımı olması gerekiyor. bu diğer şekilde yapar: (Sebebi derleyici ne kadar User
Yukarı alır ve üyelerinin boyutunu bilmek ihtiyacı olduğunu bilmesi gerekiyor.) Eğer söyleyecek olsaydın
class MyMessageBox;
class User
{
public:
// size not available! it's an incomplete type
MyMessageBox dataMsgBox;
};
Boyutu henüz bilmiyor beri iş olmaz.
Bir yan not olarak, bu fonksiyonu
void sendMessage(Message *msg, User *recvr);
Muhtemelen işaretçi tarafından şu ya da sürmez. Bir mesaj olmadan mesaj gönderebilirsiniz, ya da bir kullanıcı göndermek olmadan mesaj gönderebilirsiniz. Ve bu durumların ikisi de, her iki parametre (null son derece geçerli bir işaretçi değer!) bir argüman olarak null geçirerek ifade edilir
Bunun yerine, bir başvuru kullanın (muhtemelen) sabit:
void sendMessage(const Message& msg, User& recvr);
iOS 4.2 webfont (ttf) 'in kalın y...
ölümcül hata LNK1112: modül makine tip...
Octave-nesne yönelimli programlamada-A...
PHP-ROM't hata yazmıyor günlük...
Apache: "kimlik denetim tipi deği...