首页 > 解决方案 > C++ 返回一个 const unsigned char

问题描述

所以,我一直在努力解决这个问题。我有一个简单的函数,定义如下:

const unsigned char GetColor(unsigned int x, unsigned int y)
{
    const unsigned char color[3] = {0, 1, 0};
    return color;
} 

然而,我不允许这样做,编译器返回以下错误:

Error: cannot initialize return object of type 'const unsigned char' with an lvalue of type 'const unsigned char [3]'

我应该将数组转换为指向数组的指针,我应该返回吗?如果我这样做,我是否会冒着在“超出范围”(即超出功能)后将其删除的风险?

任何帮助理解这个问题将不胜感激:)

编辑:最终目标是拥有一个函数,它可以在给定 x 和 y 值的情况下返回像素位置的颜色。这意味着颜色会根据 x- 和 y 的值发生变化。上面的例子是一个简化。

它应该返回一个大小为 3 的 const unsigned char 数组,每个数组都有一个值。

标签: c++

解决方案


你想返回一个数字数组。你是对的,尝试将某种引用传递给局部变量会产生范围问题(技术上称为悬空指针/悬空引用),尽管原因与所示不同。(编译器只是抱怨单个schar和一个 s 数组之间的类型不一致char。)

C++ 为您提供了几种安全的方法。例如,您可以返回一个array类型:

#include <array>

std::array<unsigned char, 3> GetColor(unsigned int x, unsigned int y)
{
    return {0, 1, 0};
} 

这使得“三个字符”成为包含三个字符的特殊类型的单个变量,就像struct { unsigned char a, b, c; }. 或者你可以制作自己的类型来做类似的事情。

在上面,您可以想象“返回变量”是编译器以某种方式不可见地声明的东西,就好像它的范围是您调用函数的语句一样。该return语句写入此变量,而不是写入此函数的本地数组。

显然您需要更改调用代码,使其期望std::array<unsigned char, 3>unsigned char[3]不是std::array在新代码中,s 通常比 C 风格的数组更受欢迎,并且值得学习使用它们。

当然,总是有不安全的方式,例如:

unsigned char* GetColor(unsigned int x, unsigned int y)
{
    unsigned char* ret = new unsigned char[3] { 0, 1, 0 };
    return ret;
} 

delete[]但是,一旦不再需要它,您就不能忘记返回的指针。


推荐阅读