adding of objects

adding of objects
SA
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 4 lata
  • 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’

edytowany 6x, ostatnio: aurel
AK
Szklana kula ma już nieczynne. Nie dawaj wzmianek co jest jak zadeklarowane, tylko kod.
AK
A "errory" się podaje. Nie wiem, czy wiesz, ale nie są dla znęcania się, tylko niosą informację ...
nalik
s/throw()/noexcept/. throw(int) wywal. Nic nie wnosi. Składnia ta jest oznaczona jako deprecated od c++11. W c++17 częściowo usunięta (dokładniej to wsparcie dla niej, jakkolwiek jest to rozumiane). Od c++20 całkowicie usunięta.
kq
Kod zawiera dość informacji aby udzielić pomocy :​P
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

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

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

Lub

Kopiuj
std::cout << object1 << object2;

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
SA
niestety nie, probowalem
DO
  • Rejestracja:ponad 5 lat
  • Ostatnio:5 miesięcy
  • 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)
edytowany 1x, ostatnio: _dominik
nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:20 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?).

edytowany 1x, ostatnio: nalik

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.