2016-02-12 8 views
0

Ошибок синтаксиса нет, и это не полный код для Pixel_test.cpp и Pixel.cpp.Неисправности тестов при чтении и записи пользовательского объекта из и в строковый поток

У меня есть только полный файл заголовка.

Испытание, которое терпит неудачу, является assert(actual == correct);.

Я думал, что проблема связана с файлом Pixel.cpp в std::ostream& и std::istream&.

Я потратил часы, пытаясь понять, почему этот тест не работает, поэтому я пришел сюда, чтобы получить помощь.

Pixel_test.cpp:

stringstream in, out; 
    string correct; 
    Pixel pix; 
    pix.set(5,3,2); 
    correct = 5,3,2; 
    out << pix; 
    string actual = out.str(); 
    assert(actual == correct); 
    in << (6,4,6); 
    in >> pix; 
    assert(pix.getRed() == 6); 
    assert(pix.getBlue() == 6); 
    assert(pix.getGreen() == 4); 

Pixel.cpp:

std::ostream& operator<<(std::ostream& out, const Pixel& pix) 
{ 
    int r, g, b; 
    r = pix.getRed(); 
    g = pix.getGreen(); 
    b = pix.getBlue(); 
    out << r << g << b; 
    return(out); 
} 
std::istream& operator>>(std::istream& out, Pixel& pix) 
{ 
    int r, g, b; 
    pix.setRed(r); 
    pix.setGreen(g); 
    pix.setBlue(b); 
    out >> r >> g >> b; 
    return out; 
} 

Pixel.h:

#ifndef PIXEL_H 
#define PIXEL_H 

namespace imagelab 
{ 
    class Pixel 
    { 
    public: 
     Pixel(int r=0, int g=0, int b=0);  
     void set(int r, int g, int b); 
     void setRed(int r); 
     void setGreen(int g); 
     void setBlue(int b); 
     int getRed() const; 
     int getGreen() const; 
     int getBlue() const; 

    private: 
     int rval; // red 0-255 
     int gval; // green 0-255 
     int bval; // blue 0-255 
    }; 

    bool operator== (const Pixel& pix1, const Pixel& pix2); 
    bool operator!= (const Pixel& pix1, const Pixel& pix2); 
    std::ostream& operator<< (std::ostream& out, const Pixel& pix); 
    std::istream& operator>> (std::istream& in, Pixel& pix); 
} 

#endif 
+1

Вы распечатали 'actual' и' correct' на консоли (или посмотрели их значения с помощью отладчика), чтобы узнать, что они были? И если 'correct = 5,3,2;' потерял кавычки вокруг строкового литерала, вы назначаете символ с ASCII значением 2 в строку. –

+0

Каков тип переменной 'correct'? –

ответ

1

Для assert(actual == correct); для работы, как string s должны быть точно такими же, что в вашем случае неверно.

Итак, замените:

correct = 5,3,2; 

в Pixel_test.cpp с:

correct = "5,3,2"; 

, а также заменить:

out << r << g << b; 

в std::ostream& operator<<(std::ostream& out, Pixel& pix) с:

out << r << ',' << g << ',' << b; 

для отображения того же выхода для out << pix;.

Сделав вышеуказанные изменения, ваш assert(actual == correct); перестанет терпеть неудачу.

Но, в asserts s после этого могут быть неудачными, потому что, когда вы звоните in>>pix; эта функция вызывается:

std::istream& operator>>(std::istream& out, Pixel& pix) 
{ 
int r, g, b; 
pix.setRed(r); 
pix.setGreen(g); 
pix.setBlue(b); 
out >> r >> g >> b; 
return out; 
} 

И мы ясно видим, что rg и b не присвоены какие-либо значения, прежде чем вызывать их соответствующих set методов.

Следовательно, только значения для мусора откладываются в rvalbval и gval из pix.

Вот почему assert s:

assert(pix.getRed() == 6); 
assert(pix.getBlue() == 6); 
assert(pix.getGreen() == 4); 

обречены на провал.

EDIT:

Чтобы исправить это, вам нужно прочитать вход, что вы просто положить в поток, в переменные rg и b.

Таким образом, изменить std::istream& operator>>(std::istream& out, Pixel& pix) функцию следующим образом:

std::istream& operator>>(std::istream& out, Pixel& pix) 
{ 
int r, g, b; 
out >> r >> g >> b; 
pix.setRed(r); 
pix.setGreen(g); 
pix.setBlue(b); 
return out; 
} 

Также замените:

in << (6,4,6); 

в файле Pixel_test.cpp с:

in << "6 4 6"; 

потому что stringstream хранит данные как string ,

+0

void Pixel :: setRed (int r) \t { \t \t rval = r; \t} \t недействительного Пиксель :: setGreen (интермедиат г) \t { \t \t gval = г; \t} \t недействительного Пиксель :: setBlue (интермедиат б) \t { \t \t bval = Ь; \t} \t INT Pixel :: getRed() Const \t { \t \t возвращение (RVAL); \t} \t INT Pixel :: getGreen() Const \t { \t \t возвращение (gval); \t} \t INT Pixel :: GetBlue() Const \t { \t \t возвращение (bval); \t} Это функции, которые предоставляют назначения для r, g, b, но почему последние три утверждения все еще не работают. – terriyon

+0

@terriyon Всегда добавляйте код, заключенный в '', чтобы отображать его как код при его отображении. Эти функции верны, проблема заключается в том, как вы используете: 'in << (6,4,6); в >> pix; '. Я объясняю свой ответ для объяснения. Пожалуйста, взгляните на это. –

+0

@terriyon Редактировать Завершено. Пожалуйста, взгляните на конец сообщения. –