我目前有一个这样的课程:
struct Rgb
{
static const int NUM_CHANNELS = 3;
unsigned char channel[NUM_CHANNELS];
};
从未实例化,但用于确定指针增量的步幅。
我想根据一些运行时信息允许这个步骤改变。这样的事情会起作用吗?
#include <iostream>
class Rgb
{
public:
static int* Channel;
static void SetChannelSize(unsigned int channelSize)
{
Channel = new int(channelSize);
}
};
int main()
{
int numbers[1000];
for(unsigned int i = 0; i < 1000; i++)
{
numbers[i] = i;
}
Rgb::SetChannelSize(3);
Rgb* rgbNnumbers = reinterpret_cast<Rgb*>(numbers);
for(unsigned int i = 0; i < 5; i++)
{
std::cout << rgbNnumbers[i] << std::endl; //error: no match for ‘operator<<’ in ‘std::cout << *(rgbNnumbers + ((unsigned int)i))’
}
return 0;
}
(我不知道如何跨过我在此示例中设置的演示阵列来测试它。)
有任何意见吗?
答案 0 :(得分:1)
由于[i]
是一个编译时操作,它将不适用于编译时未知的元素大小。你必须自己用算术递增指针。
但话虽如此,很可能你在编译时确实知道了元素的大小。您可能正在编写24位和32位(等)像素深度的特定代码,因此您仍然可以使用括号来取消引用。只需整理代码即可使用正确的班级(Rgb32
,Rgb565
,Rgb24
等。
关于编译器错误,iostream不知道如何将Rgb
转换为string
,因此您自然会收到此错误。我建议创建一个Rgb::ToString()
函数。
答案 1 :(得分:0)
我假设“指针增量的步幅”,你在谈论指针递增的“字节数”。
如果是这种情况,那么简短的答案就是“不”。在第二个示例中,该类只是一个命名范围,因为没有实例成员。您将无法创建它的实例,因此不会发生这样的指针增量。
我能想到修改增量增加指针值的数量的唯一方法是在该智能指针上定义智能指针类和操作符++()。但即便如此,我也不确定它会不会让你得到你想要的东西,因为老实说我无法弄清楚你想要做什么。看起来你可能想要巧妙地解释/解包/解码一大块内存,但这可能会偏离基础。
答案 2 :(得分:0)
如果步幅在初始化时结算并且没有改变 之后,像下面这样的类似数组的类可能会遇到你的 目的:
#include <vector>
struct Rgb
{
unsigned char channel[1];
};
struct RgbArray
{
unsigned int channelSize;
std::vector< Rgb > Channel;
RgbArray( unsigned int channelSize, unsigned int elementCount )
: channelSize( channelSize ), Channel( channelSize * elementCount ) {}
Rgb& operator[]( size_t i ) { return Channel[ i * channelSize ]; }
};
int main() {
int channelSize = 3;
RgbArray rgb( channelSize, 2 );
rgb[0].channel[0] = 1;
rgb[0].channel[1] = 2;
rgb[0].channel[2] = 3;
}
由于此代码是即兴创作的,仅用于说明目的, 如果在初始化后将某些元素添加到数组中, 需要进行适当的改进。
希望这有帮助