2011-04-02 95 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; 
}