1

如何避免创建“typedef Point* pPoint;” 对于“<<”重载函数中的第二个参数?

这样做的正确方法是什么?我在哪里可以阅读更多关于它的信息?

#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;
}
4

3 回答 3

1

感谢您的解释。更正上面的代码。

 #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;
}
于 2015-11-14T03:51:31.843 回答
1

如果您在 64 位系统中编译,您的代码可能会工作,但这只是一个巧合。sizeof(p)是指针的大小,而不是它指向的数组。

您可能想用 STL 容器替换 Point 的数组,或者使您的运算符按数组大小模板化并传递对数组的引用。

于 2015-11-13T04:57:05.923 回答
1

您正在寻找:

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

N在循环条件中用作计数的位置。

这通过引用传递整个数组,因此N可在函数中使用。

您现有的代码将指针传递给第一行,因此您无法检索 size 8。相反,您使用垃圾值sizeof(p),它是存储指针所需的字节数,与您的数组维度无关。

于 2015-11-13T04:57:51.100 回答