有没有办法找出指针数组中指针的长度/数量?
即
class Notifications {
iMessage **messages;
public:
Notifications();
Notifications(const Notifications&);
Notifications& operator=(const Notifications&);
Notifications(Notifications&&);
Notifications&& operator=(Notifications&&);
~Notifications();
void operator+=(const w5::iMessage&);
void display(std::ostream&) const;
}
我怎样才能找到数组中的指针数量?
答案 0 :(得分:3)
您有三种选择,按照增加良好的顺序:
将最后一个设为null,将所有其他设为非空。这是唯一需要您的数据的解决方案,将其视为c样式字符串,除了使用指针而不是char
s。
for (iMessage** msg = messages; *msg; ++msg) { ... }
将尺寸与消息一起存储:
iMessage **messages;
const size_t size;
for (size_t i = 0; i < size; ++i) {
iMessage* msg = messages[i];
// ...
}
使用专门设计的容器在连续的内存中存储任意数量的东西:
std::vector<iMessage*> messages;
for (iMessage* msg : messages) {
// ...
}
基本上是这样的,除非你事先知道messages
的大小并且它是编译时常量,在这种情况下,其中一个:
iMessage* messages[100];
std::array<iMessage*, 100> messages;
为您提供类型中的大小。
答案 1 :(得分:0)
没有标准的方法可以做到这一点。一些编译器具有返回所分配块的大小的函数,例如, Visual Studio中的_msize。如果你用指针的大小除以它,你将获得&#34;数组&#34;中的元素数量。
但除了非标准之外,这只有作用,如果&#34;数组&#34;已动态分配并且调用者打算使用整个块作为数组 - 情况并非总是如此:某些库在标准库之上构建自己的分配函数。他们分配大块,然后在内部进一步分发该块。
执行此操作的正确方法(而不是从指针中猜测大小)将是让创建数组的代码将大小传递给您并将其与指针一起存储。或者,您可以使用为您执行此操作的C ++类(除此之外还可以检查边界)。