Есть ли способ узнать длину/количество указателей в массиве указателей?
т.е.
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;
}
Как я смогу найти количество указателей в массиве?
У вас есть три варианта, в порядке повышения доброты:
Сделайте последнее значение null, а все остальные - ненулевым. Это единственное решение, которое требует что-то из ваших данных, считайте его как строку c-style, за исключением указателей вместо 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;
дает вам размер в типе.
Нет стандартного способа сделать это. Некоторые компиляторы имеют функции, чтобы вернуть размер выделенного блока, например _msize в Visual Studio. Если вы разделите это по размеру указателей, вы получите количество элементов в вашем "массиве".
Но кроме того, что он не является стандартным, это работает только в том случае, если "массив" был распределен динамически, и вызывающий намеревается использовать весь блок для массива - это не всегда так: некоторые библиотеки строят собственные функции распределения поверх стандартные. Они выделяют большие блоки, а затем распределяют этот блок внутри себя.
Правильный способ сделать это (вместо того, чтобы угадывать размер от указателя), это позволить коду, который создал массив, передать размер вам и сохранить его вместе с указателем. Кроме того, вы можете использовать классы C++, которые сделают это для вас (и, возможно, также проведут проверку границ).