如何访问类

时间:2016-06-28 18:55:54

标签: c++ vector

我是一个介绍性的C ++类,我们的任务是编写一个读取.ppm图片文件的程序,复制它,然后将其写入输出文件。

为此,我的PpmPicture类有一个向量向量,其中每个索引都包含一个带有红色,绿色和蓝色整数的Pixel。

我的问题在于我的输出功能,我正在尝试将这些int输出到文件中。我如何单独访问它们?这是我的代码,您可以看到我在writePpmFile函数底部输出这些值的位置。我知道picture.red [0] [0]没有任何意义,我只是试图强行解决问题,这恰好是我尝试的最后一件事。

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;

struct Pixel {
    Pixel();
    Pixel(int redValue, int greenValue, int blueValue);
    int red;
    int green;
    int blue;
};

Pixel::Pixel() {
    red = 0;
    green = 0;
    blue = 0;
}

Pixel::Pixel(int redValue, int greenValue, int blueValue) {
    red = redValue;
    green = greenValue;
    blue = blueValue;
}

class PpmPicture {
public:
    PpmPicture();
    bool readPpmFile(string inputFile);
    int writePpmFile(string outputFile);
private:
    vector<vector<Pixel> > picture;
    int rows;
    int columns;
    int intensity;
};

PpmPicture::PpmPicture() {
    rows = 0;
    columns = 0;
}

int main(int argc, char *argv[]) {
    PpmPicture myPic;

    if(argc != 3) {
        cout << "usage: inputfile outputfile";
        return 0;
    }

    myPic.readPpmFile(argv[1]);
    myPic.writePpmFile(argv[2]);
}

bool PpmPicture::readPpmFile(string inputFile) {
    Pixel pix;
    vector<Pixel> tempArray;
    fstream fin;
    string fileType;
    int i, j;

    fin.open(inputFile.c_str());
    //Check if file opened
    if(fin.fail()) {
        return false;
    }

    while(!fin.eof()) {
        //Input first four values into appropriate variables
        fin >> fileType >> columns >> rows >> intensity;
        //Fill tempArray with pixel values
        while(fin >> pix.red >> pix.green >> pix.blue) {
            tempArray.push_back(pix);
        }
    }

    //Read file until you reach the number of rows specified by the file
    for(j = 0; j < rows; j++) {
        //Input pixel values into each index in the row array
        //Enter new row when one row's width is achieved
        for(i = 0; i < columns; i++) {
            picture[j].push_back(tempArray[i]);
        }
    }

    return true;
}

int PpmPicture::writePpmFile(string outputFile) {
    ofstream fout;
    int i, j, temp;

    fout.open(outputFile.c_str());
    if(fout.fail()) {
        return -2;
    }

    if(columns < 0 || rows < 0) {
        return -1;
    }

    fout << "P3" << endl;
    fout << columns << rows << endl;
    fout << intensity << endl;
    fout << picture.red[0][0];
    fout << picture.green[0][0];
    fout << picture.blue[0][0];

    /*for(j = 0; j < rows; j++) {
        for(i = 0; i < columns; i++) {
            fout << picture[j][i] << " ";
        }
    }*/

    return 0;
}

我应该补充一下,就像我说的这是一个入门课程,所以我们没有经历过很多快捷方式/不同的功能。因此,如果可能的话,保持它有点简单(即使效率不高)将是首选:)

2 个答案:

答案 0 :(得分:0)

这主要是应用你已经知道的问题,但似乎你是以一种奇怪的顺序做这件事。

由于picturevector<vector<Pixel>>picture[i]vector<Pixel>picture[i][j]Pixel

Pixel的组件始终以相同的方式访问 - pixelvalue.componentname - 因此Pixel的组件为picture[i][j].redpicture[i][j].green和{ {1}}。

答案 1 :(得分:0)

更好的解决方法是为Pixel撰写insertion operator,例如:

ostream& operator<<(ostream& lhs, const Pixel& rhs) {
    lhs << rhs.red << ' ' << rhs.green << ' ' << rhs.blue;
}

鉴于此,您可以仅使用以下命令将所有vector<Pixel> picture流式传输到ostream fout

copy(cbegin(picture), cend(picture), ostream_iterator<Pixel>(fout, " "))