Как я могу избежать создания «typedef Point * pPoint;» для 2-го параметра в<<перегруженная функция?
Каков был бы правильный способ сделать это? Где я могу прочитать больше об этом?
#include <iostream>
using namespace std;
typedef float Point[3];
typedef Point* pPoint;ostream & operator << (std::ostream &os, const pPoint & p )
{
int size = sizeof(p);
for (int i=0; i<size; i++)
{
os << "[" << p[i][0] << "," << p[i][2] << "," << p[i][2] << "]" << endl;
}
return os;
}
int main() {
Point corners[8] = {
{ 1, -1, -5},
{ 1, -1, -3},
{ 1, 1, -5},
{ 1, 1, -3},
{-1, -1, -5},
{-1, -1, -3},
{-1, 1, -5},
{-1, 1, -3}
};
cout << "Point:" << corners<< endl;
return 0;
}
Ваш код может работать, если вы компилируете в 64-битной системе, но это просто совпадение. sizeof(p)
размер указателя, а не массив, на который он указывает.
Возможно, вы захотите заменить массив Point контейнером STL или сделать свой оператор шаблонным по размеру массива и передать ссылку на массив.
Ты ищешь:
template<size_t N>
ostream & operator<< (std::ostream &os, Point const (&p)[N])
где вы используете N
как количество в условии цикла.
Это передает весь массив по ссылке, и так N
доступен для использования в функции.
Вместо этого существующий код передает указатель на первую строку, поэтому у вас нет возможности получить размер 8
, Вместо этого вы используете значение мусора sizeof(p)
это число байтов, необходимое для хранения указателя, никак не связанное с размером вашего массива.
Спасибо за объяснение. исправляя приведенный выше код.
#include <iostream>
using namespace std;
typedef float Point[3];
template<size_t N>
ostream & operator<< (std::ostream &os, Point const (&p)[N])
{
int size = sizeof(p)/sizeof(*p);
for (int i=0; i<size; i++)
{
os << "[" << p[i][0] << "," << p[i][2] << "," << p[i][2] << "]" << endl;
}
return os;
}
int main() {
Point corners[4] = {
{ 1, -1, -5},
{ 1, -1, -3},
{ 1, 1, -5},
{ 1, 1, -3},
};
cout << "Point:" << corners<< endl;
return 0;
}