2011-04-02 52 views
7

我的目標是一個類,如:C++定義類的成員結構和成員函數返回它

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

但是編譯器會發出錯誤的是,在公共職能getInfo(int)的確定指標的返回類型userInfo不是一個類型名稱。

回答

4

您需要更改的UserInformation成員的順序,並把struct UserInfo上述getInfo聲明。編譯器抱怨說它不能算出getInfo的簽名,因爲它還沒有看到它的返回類型的定義。另外,如果從函數返回一個結構,結構的類型必須對調用者可見。所以你也需要製作struct public

4

如果成員函數是公共的,那麼返回類型必須公開可見!因此,請將內部結構定義移至public部分。

還要注意,它必須在使用它之前的之前定義

4

只要做UserInformation::userInfo UserInformation::getInfo(int userId)

此外,您應該聲明userInfo公共。

+0

爲什麼我們需要userInfo的限定符UserInfomation。默認情況下編譯器不應該在UserInformation的名字範圍中檢查嗎? – anaken78 2016-12-12 23:54:44

+0

@ anaken78你,我或任何其他人認爲符合的編譯器_應該做的事是無關緊要的。這是**做的**。在函數的參數列表打開之前,該類不在範圍內,因此不能查找那裏的名稱不合格。我敢肯定,在解析&whatnot方面,背後的理由已經在其他地方詳細討論過了,如果你想搜索它的話。或者只是使用尾隨返回類型:'auto UserInformation :: getInfo(int userId) - > userInfo'(順便說一句,這些都是一些錯誤的命名選擇)。當在該位置聲明返回類型時,該類及其成員處於範圍內。 – 2017-05-26 17:59:13

12

因爲用戶代碼應該可以使用它,所以使嵌套結構類型公開是有意義的。另外,將結構的聲明放在第一次使用的位置之前。在類作用域之外使用作用域分辨率::來引用嵌套類型。

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