c++ - 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 数组,每个数组都有一个值。
解决方案
你想返回一个数字数组。你是对的,尝试将某种引用传递给局部变量会产生范围问题(技术上称为悬空指针/悬空引用),尽管原因与所示不同。(编译器只是抱怨单个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[]
但是,一旦不再需要它,您就不能忘记返回的指针。
推荐阅读
- go - go - 如何跨所有连接的tcp客户端访问变量?
- python - 计算两个节点 NetworkX 之间的最长路径
- java - 拖放方法不会触发
- jquery - 有没有办法强制``元素尊重偏移?(即用户当前滚动位置)何时触发“自定义框”模式?
- xml - 使用 XML 从 XML 转换为 CSV 时 CSV 文件中的标题
- java - 如果我将方法分配给变量是在java中调用的方法吗?
- python - 在熊猫数据框中加载多文档 yaml 文件时缺少第一个文档
- liferay - Liferay 模块侦听器:无法获取对模型进行更改的人员
- sql - 从动态字符串中删除字符
- sql - 使用案例语句作为枢轴 - DB2 SQL