【问题标题】:C++ define class member struct and return it in a member functionC++定义类成员结构并在成员函数中返回
【发布时间】:2011-04-02 12:24:35
【问题描述】:

我的目标是这样的课程:

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 不是类型名称。

【问题讨论】:

    标签: c++ class function struct class-members


    【解决方案1】:

    将嵌套结构类型公开是有意义的,因为用户代码应该能够使用它。此外,将结构的声明放在第一次使用之前。在类范围之外使用范围解析 :: 来引用嵌套类型。

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

    【讨论】:

      【解决方案2】:

      如果成员函数是公开的,那么返回类型必须是公开可见的!因此,将内部结构定义移动到public 部分。

      还要注意,它必须在使用它的函数之前定义

      【讨论】:

        【解决方案3】:

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

        另外,你应该声明userInfo public。

        【讨论】:

        • 为什么userInfo. Shouldn't the compiler by default check in the namescope of UserInformation`需要限定符UserInfomation
        • @anaken78 你、我或其他任何人认为兼容的编译器应该做什么是无关紧要的。这就是它所做的 所做的。在打开函数的参数列表之前,该类不在范围内,因此无法在其中查找不合格的名称。我确信这背后的原因,在解析和诸如此类的方面,已经在别处详细讨论过,如果你想搜索它。或者只使用尾随返回类型:auto UserInformation::getInfo(int userId) -> userInfo(顺便说一句,这些是一些糟糕的命名选择)。当在该位置声明返回类型时,该类及其成员在范围内。
        【解决方案4】:

        你需要改变UserInformation的成员顺序,把struct UserInfo放在getInfo的声明之上。编译器抱怨它无法计算出getInfo 的签名,因为它还没有看到其返回类型的定义。

        此外,如果您从函数返回结构,则结构的类型必须对调用者可见。所以你还需要创建结构public

        【讨论】:

          猜你喜欢
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-13
          • 2019-04-15
          • 2019-07-28
          相关资源
          最近更新 更多