SORU
25 Ocak 2010, PAZARTESİ


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
25 Ocak 2010, PAZARTESİ


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RaquelGamesBR

    RaquelGamesB

    20 HAZİRAN 2009
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011
  • TheTwistedFrequency

    TheTwistedFr

    26 NİSAN 2010