Problem z operatorem przypisania

0
struct LiczbaZespolona
{
  double  re;
  double  im;

  LiczbaZespolona operator = ( double  liczba);
};
LiczbaZespolona LiczbaZespolona:: operator = ( double  liczba)
{
    LiczbaZespolona Z;

    Z.re=liczba;
    Z.im=liczba;
    return Z;	
}

Chce wyzerować liczbę :

LiczbaZespolona w_wynik;
w_wynik=0;

cout << " Sprawdzam  czy wyzerowano wynik  : "<<w_wynik<<endl;

Wyświetla mi smieci typu -1.08233+5.26778i, przeciążenie wyjścia mam dobrze zdefiniowane. Co tutaj jest źle ?

0
LiczbaZespolona &operator=(double  liczba) { re=liczba; im=0; return *this; }
0
LiczbaZespolona LiczbaZespolona::  operator = (   const LiczbaZespolona & Z2){
	
	re=Z2.re;
    im=Z2.im;
    return *this;
 
}
	
LiczbaZespolona LiczbaZespolona:: operator=( double  liczba){
	 re=liczba; 
	 im=0; 
return *this; } 

Tak to mam zrealizowane w przypadku przypisywania innej zespolonej lub zera.
Napotkałem natomiast na inny problem. Otóż w moim programie wczytuję liczby z pliku .txt z wykorzystaniem **przekierowania strumienia wejściowego na plik **i nijak nie potrafię dojść do końca pliku.
Przypuszczam, że w pogrubionym tekscie tkwi problem (./prog < liczby.txt), czy w ogóle na standardowym wejściu jest coś takiego jak EOF ?

Próbowałem tak :

 
#include <iostream>
#include <cstdio>
#include <iomanip>


char eo;
     
while(!cin.eof()){    
	
	
	
cin >> eo;
  
  if(eo==EOF){
    cin.setstate(ios::eofbit);  
    continue;}   // continue , bo jesli jest koniec to chce przejsc do warunku pętli i z niej wyjsc, bo warunek nie bedzie wówczas spełniony
    else
     ungetc(eo,stdin);

// dalsze operacje na danych .... 
	

W ogóle to nigdy nie jest spełniony warunek eo==EOF, nie wiem dlaczego, dołączyłem bibliotekę cstdio.
Problem polega więc na warunku if , a nie na błędnym ustawieniu flagi ios..

1

oba operatory muszą zwrócić referencje na liczbę zespoloną czyli:
LiczbaZespolona &
a to nie jest to samo co wartość:
LiczbaZespolona

Wystarczy:

while(cin>>eo)
  {
  }
0

Muszą zwrócić referencję , po to aby można było wywołać te funkcje kasakadowo tzn " a=b=c; , tak ?

Jesli chodzi o pomysł dotyczący eof, to działa, ale nadal nie mam pojęcia dlaczego moja wersja nie ?
Czyli przyjmujemy, że znak EOF ma zawsze wartość zero ? Dlaczego warunek eo==EOF nie zadziałal ?

0
enum Symbol { e, a, b, c, d };

struct Symbole{
	
        Symbol Arg;
	
		Symbol operator = ( int liczba );
	
		Symbol operator = (Symbol Arg2);
	
	
};

// definicja

Symbol  Symbole:: operator = ( int liczba ){
 

 Symbol Tab[] = { e,a,b,c,d};
 Arg=Tab[liczba]; 

 return Arg;
} 	


 

W programie chce po prostu wyzerować argument typu symbol przypisując Arg=0, czyli tak naprawdę podstawić 'e'. Wywala mi : error: invalid conversion from ‘int’ to ‘Symbol’ [-fpermissive] .

0
Symbol operator = ( int liczba );
Symbol operator = (Symbol Arg2);

A nie przeciazasz tego operatora dla typu Symbole? + ile razy mozna mowic, ze to musi byc referencja?

0

Rzeczywiscie tak jest, ale skoro przypisanie musi być składową klasy, a mam do czynienia z typem wyliczeniowym to jak to zrealizować ?

 Symbol & Symbole:: operator = ( int liczba ){
 

 Symbol Tab[] = { e,a,b,c,d};
 Arg=Tab[liczba]; 

 return *this;
} 

invalid initialization of reference of type ‘Symbol&’ from expression of type ‘Symbole’

0

struct Symbole{
	
	
        Symbol Arg;
	
		Symbole & operator = ( int liczba );
	
		Symbole & operator = (Symbol & Arg2);
	
	
};

// To nie działa , nie mam pojęcia dlaczego nadal 
 Symbole & Symbole:: operator = ( int liczba ){
 

 Symbol Tab[] = { e,a,b,c,d};
 Arg=Tab[liczba]; 

 return *this;

// A to poniżej działa .... 

Symbole & Symbole:: operator = ( Symbol & Arg2){
	
    Symbol Tab[] = { a,b,c,d,e};
	Arg=Tab[Arg2-'a'];
	
	return *this;
}



}

Nic więcej nie zmieniałem i jest błąd invalid conversion from ‘int’ to ‘Symbol’ [-fpermissive]
wszędzie tam gdzie np podstawiam sobie Arg=0; Ciekawe bo przypisanie innego argumentu typu wyliczeniowego już działa poprawnie a definicja jest niemal identyczna....

0

Wystarczy tyle:

Symbole &Symbole::operator=(int liczba) { Arg=(Symbol)liczba; return *this; }
Symbole &Symbole::operator=(Symbol Arg2) { Arg=Arg2; return *this; }

To pierwsze podałem jako komentarz w poście wyżej.

Konwersje pomiędzy int'em a enum'em.
http://ideone.com/4eiF7Z

0

Chcę przeciążyć operator +=

Symbole & Symbole:: operator += (const  Symbol & Arg2){
	
    Symbol Tab[] = { a,b,c,d,e};
	Arg=(Arg+Tab[Arg2-'a']);
	
	return *this;
} 
enum Symbol { e, a, b, c, d };

struct Symbole{
	 
	   Symbol Arg;
	 Symbole &  operator += (const  Symbol & Arg2); 
 

};

Otrzymuję taki komunikat o błędach :
src/dzialania.cpp44: error: no match for ‘operator+=’ in ‘(& m_wynik)->Macierz::operator()(i, j) += operator*(((const Symbol)(& M1)->Macierz::operator()(i, k)), ((const Symbol)(& M2)->Macierz::operator()(k, j)))’

1 użytkowników online, w tym zalogowanych: 0, gości: 1