我正在动态创建3个MyClass对象。
MyClass *ptr = new MyClass[3];
我假设ptr是所述对象的第一个实例的地址。我能做到
(*ptr).doStuff();
然而,当我尝试通过
访问第二个对象时(* (ptr + sizeof(MyClass)) ).doStuff();
它会引发异常。我怎么能得到其他物体?
答案 0 :(得分:3)
以下是选项(从大多数推荐到最不推荐):
ptr[1].doStuff();
(ptr+1)->doStuff();
(*(ptr+1)).doStuff();
((MyClass*)((char*)ptr+sizeof(MyClass)))->doStuff();
(*(MyClass*)((char*)ptr+sizeof(MyClass))).doStuff();
答案 1 :(得分:2)
有效代码将显示为
(* (ptr + 1) ).doStuff();
这就是所谓的指针算术。你"转移"指向所需元素数量的指针。
答案 2 :(得分:2)
因为将ptr
递增1并不是简单地将指针递增1个字节。相反,它将指针移动到指向数组的下一个元素。而不是你的最后一行,你必须写
(* (ptr + 1) ).doStuff();
或:
(ptr+1)->doStuff();
或者,更具可读性,正如评论者所建议的那样:
ptr[1]->doStuff();
答案 3 :(得分:2)
指针算法已经考虑了指针类型的大小。所以你应该加1
,而不是sizeof(MyClass)
。
否则你太过分了。