【问题标题】:Unable to return pointer to array C++ visual studio无法返回指向数组 C++ Visual Studio 的指针
【发布时间】:2021-10-16 23:14:17
【问题描述】:

我是 C++ 的新手,正在为使用数组和返回指针的想法苦苦挣扎。

我在.h 文件中有一个课程Student

class Student {
    public:
        // stuff
        int* GetNumDaysPerCourse() const;
        // stuff

    private:
        //stuff
        int numDaysPerCourse[3];
        // stuff
};

我正在尝试在.cpp 文件中实现它:

int* Student::GetNumDaysPerCourse() const {
    return numDaysPerCourse;
}

但我收到一条错误消息:

返回值类型与函数类型不匹配

我很困惑,因为看看其他问题,这似乎是一种有效的方法。

那么,如何在 C++ 中使用 getter 返回类成员数组?

【问题讨论】:

  • 您希望人们能够更改指针指向的数组的值吗?
  • 请尝试创建一个合适的minimal reproducible example 向我们展示,然后将该示例的完整构建输出复制粘贴到您的问题中。
  • error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive] return numDaysPerCourse; 是我看到的错误,因为它没有包含在问题中。
  • 顺便说一下,如果调用者没有正确使用指针(修改不应修改的数据、超出范围等),则返回指向内部数据的指针可能会导致问题。我建议您使用std::array<int, 3> 作为数组,并通过常量引用或值返回。
  • @Mr.Spock 好的。然后,您将需要 Remy Lebeau 的回答中的选项 2

标签: c++ arrays class


【解决方案1】:

当我尝试compile this code 时,我收到此错误:

错误:从‘const int*’到‘int*’的无效转换

这是因为GetNumDaysPerCourse()const-qualified,所以它的this指针指向一个const Student对象,因此它的numDaysPerCourse成员被视为const数据.您不能将 const 数据的地址分配给指向非 const 的指针(即,没有明确的类型转换,但不要这样做),因为这将授予外部代码修改数据的权限(可能)存储在只读存储器中。

所以,您需要:

  • GetNumDaysPerCourse() 中删除const 限定符:
public:
    ...
    int* GetNumDaysPerCourse();
    ...

private:
    ...
    int numDaysPerCourse[3];
    ...
};
int* Student::GetNumDaysPerCourse() {
    return numDaysPerCourse;
}
  • 使GetNumDaysPerCourse() 返回一个指向常量的指针:
public:
    ...
    const int* GetNumDaysPerCourse() const;
    ...

private:
    ...
    int numDaysPerCourse[3];
    ...
};
const int* Student::GetNumDaysPerCourse() const {
    return numDaysPerCourse;
}
  • 结合这两种方法来提供对同一数组的 const 和非 const 访问,具体取决于调用 GetNumDaysPerCourse() 的对象是可变的还是只读的:
public:
    ...
    int* GetNumDaysPerCourse();
    const int* GetNumDaysPerCourse() const;
    ...

private:
    ...
    int numDaysPerCourse[3];
    ...
};
int* Student::GetNumDaysPerCourse() {
    return numDaysPerCourse;
}

const int* Student::GetNumDaysPerCourse() const {
    return numDaysPerCourse;
}

【讨论】:

    【解决方案2】:

    如果调用int *GetNumDaysPerCourse() const;后不需要修改指针

    您可以按如下方式修改您的类和您的实现:

    class Student {
    public:
        // stuff
        const int *GetNumDaysPerCourse() const;
        // stuff
    
    private:
        //stuff
        int numDaysPerCourse[3];
        // stuff
    };
    

    .cpp 文件:

    const int *Student::GetNumDaysPerCourse() const {
        return numDaysPerCourse;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2014-12-30
      • 2022-11-21
      • 1970-01-01
      相关资源
      最近更新 更多