0

Как я могу избежать создания «typedef Point * pPoint;» для второго параметра в функции «< <»?C++ ostream перегрузка параметра указателя массива typedef

Что было бы правильным путем? Где я могу узнать больше об этом?

#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. Вместо этого вы используете значение garbage 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; 
} 
Смежные вопросы