重载插入操作

时间:2014-09-28 01:07:02

标签: c++ operator-overloading

我试图写一个文件,但我收到一个错误,我认为是因为我需要重载我的插入操作符。这就是我到目前为止所拥有的

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct color
{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

void initialize(color arr[][600], int nrows, int ncols);
void writeAll(color arr[][600], int nrows, int ncols);
const int NROWS = 400;
const int NCOLS = 600;


int main()
{
    color arr[400][600];
    initialize(arr, 400, 600);
    writeAll(arr, 400, 600);
    return 0;
}

// Background

void initialize(color arr[][NCOLS], int nrows, int ncols)
{
    for (int row = 0; row < NROWS / 2; row++)
    {
        for (int col = 0; col < NCOLS / 2; col++)
        {
            arr[row][col].r = 255;
            arr[row][col].g = 255;
            arr[row][col].b = 255;
        }
    }
}

void writeAll(color arr[][600], int nrows, int ncols)
{
    ofstream fout("out.ppm", ios::out | ios::binary);
    fout << "P6" << endl;
    fout << ncols << " " << nrows << endl;
    fout << 255 << endl;
    for (int row = 0; row < nrows; row++)
    {
        for (int col = 0; col < ncols; col++)
        {
            fout << arr[row][col];
        }
    }
    fout.close();
}

该行

fout << arr[row][col];

给我一​​个错误&#34;没有操作员&#34;&lt;&lt;&#;匹配这些操作数

从我已经完成的研究看来,似乎我必须重载该操作数,但我找不到任何关于重载不属于类的内容。

2 个答案:

答案 0 :(得分:0)

就像它是一个班级一样。例如,这是一种可能的实现方式:

ofstream& operator<<(ofstream& os, const color& c)
{
    os << c.r << '\t' << c.g << '\t' << c.b;
    return os;
}

有效。只需根据您的需要调整os <<....即可。

答案 1 :(得分:0)

在C ++中,structclass都声明了类。唯一的区别是默认情况下它们的成员是公共的还是私有的(模数编译器错误。我 发现了嵌套枚举类成员的一个讨厌的情况(尽管使用了{{1}关键字!)一次)。

也就是说,完全有可能重载运算符,其中一些参数是非类型类型(空指针,指针,任何类型的引用,联合,代数,成员指针,成员函数指针;它是不可能的有一个函数,数组或void类型的参数,但它可以有指针或引用它们(除了对void的引用)),事实上你将重载它作为引用,而不是类,无论如何。唯一的规则是至少有一个参数(包括成员的隐式class参数)必须在某处包含用户定义的类型(在本例中,在引用下)。

您需要的签名是

this

如果你需要访问你的私有条件(在这种情况下你没有私有条件),这需要在类外部实现,或者在类内部实现{<1}}