adding of objects

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 61
0

Czesc,

wie ktosc skad rozbieznosc w danym przykladzie, gdzie mam zdefiniowany operator + orac operatory << i >> jako friend

Kopiuj
result = object1 + object2;
std::cout << result;

dziala ok, ale ponizszy przyklad daje error:

Kopiuj
std::cout << object1 + object2;

kod:

Kopiuj
ostream &operator<<(ostream &out, Object &test) throw(){
    out << test.x;
    return out;
}

istream &operator>>(istream &in, Object &test) throw(int){
    int tmpInt;
    in >> tmpInt;
    x.set_x(tmpInt);
}

Modulo Modulo::operator+(const Object &test) throw(){
    Object result(x + test.x);
    return result;
}

error:

error: cannot bind non-const lvalue reference of type ‘Object&’ to an rvalue of type ‘Object’

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
0

Może kolejność wykonywania działań? Spróbuj:

Kopiuj
std::cout << (object1 + object2);

Lub

Kopiuj
std::cout << object1 << object2;
DO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 85
5

Twoja metoda operator<< oczekuje referencji, a Ty jej nie przekazujesz w ten sposób. Najprostszy sposób, żeby zadziałało to zmiana definicji na:

Kopiuj
ostream &operator<<(ostream &out, const Object& test)
nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
4
sabek napisał(a):

+error:

Kopiuj
error: cannot bind non-const lvalue reference of type ‘Object&’ to an rvalue of type ‘Object’

Kompilator dobrze prawi. Wynikiem dodawania będzię obiekt typu Modulo (domyślam się, że dziedziczy po Object, chociaż to wygląda strasznie podejrzanie), de facto tymczasowy, bo nie przypisany do niczego. Powstałego obiektu nie da się przekazać do twojego operator >>, ponieważ zdefiniowałeś go tak, że oczekuje referencji. Obiekty tymczasowy nie może być przekazany przez referencję, która nie jest stała albo nie jest rvalue (prawostronna? r-wartość? jak to się tłumaczy?).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.