繁体   English   中英

C++ 返回一个 const unsigned char

[英]C++ Returning a const unsigned char

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

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]'

我应该将数组转换为指向数组的指针,我应该返回吗? 如果我这样做,难道我不会冒着在“超出范围”之后将其删除的风险——也就是超出 function 的风险吗?

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

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

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

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

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; } struct { unsigned char a, b, c; } 或者你可以制作自己的类型来做类似的事情。

在上面,您可以想象编译器以某种方式隐式声明的“返回变量”,就好像它的 scope 是您调用function 的语句。 return语句写入这个变量,而不是这个 function 的本地数组。

显然,您需要更改调用代码,使其期望std::array<unsigned char, 3>而不是unsigned char[3] ,但是a)以前的版本无论如何都无法正常工作,所以我们在说新代码而不是尝试更改现有代码库,并且 b) std::array通常在新代码中优于 C 风格的 arrays 并且值得学习使用它们。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM