перегрузка оператора — C ++ ostream перегрузка параметра указателя массива typedef

Как я могу избежать создания «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;
}

0

Решение

Ваш код может работать, если вы компилируете в 64-битной системе, но это просто совпадение. sizeof(p) размер указателя, а не массив, на который он указывает.

Возможно, вы захотите заменить массив Point контейнером STL или сделать свой оператор шаблонным по размеру массива и передать ссылку на массив.

0

Другие решения

Ты ищешь:

template<size_t N>
ostream & operator<< (std::ostream &os, Point const (&p)[N])

где вы используете N как количество в условии цикла.

Это передает весь массив по ссылке, и так N доступен для использования в функции.

Вместо этого существующий код передает указатель на первую строку, поэтому у вас нет возможности получить размер 8 , Вместо этого вы используете значение мусора sizeof(p) это число байтов, необходимое для хранения указателя, никак не связанное с размером вашего массива.

0

Спасибо за объяснение. исправляя приведенный выше код.

 #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;
}
0
По вопросам рекламы [email protected]