2011-04-02 30 views
7

Amacım bir sınıf gibi:C++ sınıfı üye yapı tanımlamak ve bir üye işlev iade

class UserInformation 
{ 
public: 
    userInfo getInfo(int userId); 
private: 
    struct userInfo 
    { 
     int repu, quesCount, ansCount; 
    }; 
    userInfo infoStruct; 
    int date; 
}; 

userInfo UserInformation::getInfo(int userId) 
{ 
    infoStruct.repu = 1000; 
    return infoStruct; 
} 

ancak derleyici hata veriyor kamu görevi getInfo(int) ait Definition dönüş tipi userInfo bir tür olmadığını ad.

cevap

4

Sen getInfo ilanını UserInformation üyelerinin sırasını değiştirmek ve yukarıda struct UserInfokoymak gerekir. Derleyici, getInfo için imzayı alamadığından şikayet etti çünkü henüz dönüş türünün tanımını görmedi.

Ayrıca, bir yapıyı işlevden döndürüyorsanız, yapının türü, arayanlar tarafından görülebilir olmalıdır. Yani, public yapısını da oluşturmanız gerekir.

4

Üye işlevi herkese açıksa, dönüş türü herkes tarafından görülebilir olmalıdır! Bu nedenle, iç yapı tanımını public bölümüne taşıyın.

Not:'un kullanılmasını gerektiren işlevden önce tanımlanmalıdır.

4

Sadece UserInformation::userInfo UserInformation::getInfo(int userId) yapın. Ayrıca, userInfo genel bildirmelisiniz.

+0

Neden userInfo için "UserInfomation" niteleyicisine ihtiyacımız var. Derleyici varsayılan olarak 'UserInformation' adkopini kontrol etmemeli mi? – anaken78

+0

@ anaken78 Siz, ben ya da başka biri, uyumlu bir derleyici _should_'ın alakasız olduğunu düşünüyor. Bu, ** yaptığı gibi. Sınıf, fonksiyonun argüman listesi açılıncaya kadar kapsam dahilinde değildir, bu yüzden oradaki isimler niteliksiz olarak görülemez. Bunun ardındaki mantığın, ayrıştırma ve neyin değil, başka bir yerde tartışıldığına eminim. Ya da sadece bir geri dönüş tipi kullanın: 'auto UserInformation :: getInfo (int userId) -> userInfo' (btw, bunlar bazı kötü adlandırma seçenekleridir). Sınıf ve üyeleri, geri dönüş türü bu konumda beyan edildiğinde kapsam dahilindedir. –

12

Kullanıcı kodu onu kullanabildiği için yuvalanmış yapı türünü genel yapmak mantıklıdır. Ayrıca, ilk kullanım noktasından önce yapının beyanını yerleştirin. Sınıf kapsamının dışında iç içe türlere başvurmak için kapsam çözünürlüğü :: kullanın.

class UserInformation 
{ 
public: 
    struct UserInfo 
    { 
     int repu, quesCount, ansCount; 
    }; 


public: 
    UserInfo getInfo(int userId); 

private: 
    UserInfo infoStruct; 
    int date; 
}; 

UserInformation::UserInfo UserInformation::getInfo(int userId) 
{ 
    infoStruct.repu = 1000; 
    return infoStruct; 
}