Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] klasy operator<<

Ostatnio zmodyfikowano 2015-09-19 23:54
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[c++] klasy operator<<
» 2015-09-19 14:31:53
plik op_c.h:
C/C++
#pragma once

#include <iostream>
using std::ostream;
class klasa {
    float m_a;
    float m_b;
public:
    klasa();
    klasa( const float & a, const float & b );
    ~klasa();
    klasa operator +( const klasa & ob ) const;
    klasa operator +( float f ) const;
    friend klasa operator +( float f, const klasa & ob );
    friend ostream & operator <<( ostream & os, const klasa & ob );
};

plik op_c.cpp;
C/C++
#include "op_c.h"

klasa::klasa()
    : m_a( 0 )
     , m_b( 0 )
{ }

klasa::klasa( const float & a, const float & b )
    : m_a( a )
     , m_b( b )
{ }

klasa::~klasa() { }

klasa klasa::operator +( const klasa & ob ) const {
    return klasa( m_a + ob.m_a, m_b + ob.m_b );
}

klasa klasa::operator +( float f ) const {
    return klasa( m_a + f, m_b + f );
}

klasa operator +( float f, const klasa & ob ) {
    return klasa( f + ob.m_a, f + ob.m_b );
}

ostream & operator <<( ostream & os, const klasa & ob ) {
    return os << ob.m_a << ", " << ob.m_b << std::endl; // tutaj kompilator twierdzi, że os jest niezdefiniowane
}

plik testujący:
C/C++
#include <tchar.h>
#include <conio.h>
#include "op_c.h"

int _tmain( int argc, _TCHAR * argv )
{
    using std::cout;
    using std::endl;
    klasa ob1( 1.5, 2.5 );
    klasa ob2( 2.5, 5.0 );
    klasa total;
    cout << ob1;
    cout << ob2;
   
    cout << "dwa obiekty: " << endl;
    total = ob1 + ob2; // uzycie metody operatorowe
    cout << total;
    total = ob1.operator +( ob2 ); // uzycie metody funkcyjne
    cout << total;
    cout << endl;
   
    cout << "obiekt i liczba:" << endl;
    total = ob1 + 2.5; // uzycie operatorowe, ale ob1 musi wywolywac
    cout << total;
    total = ob2.operator +( 2.5 ); // uzycie funkcyjne, ale ob2 musi wywolywac
    cout << total;
    cout << endl;
   
    cout << "liczba i obiekt:" << endl;
    total = 2.5 + ob1; // uzycie operatorowe
    cout << total;
    total = operator +( 2.5, ob2 ); // uzycie funkcji (zwykle, nie mozna jak metody z kropka)
    cout << total;
    cout << endl;
   
    _getch();
}

Jak możecie to skompilujcie to u siebie.
Piszę sobie takie proste przykłady użycia przeciążonych operatorów żeby mieć pod ręką jak czegoś zapomnę.
Jednak jest kłopot z operatorem<<.

Jak napiszę sobie metodę show() do pokazywania obiektów jest ok.
Program powinien działać prawidłowo, przynajmniej nie widzę tu jakiś nieprawidłowości.
Jeśli będzie ok to kompilator strzela fochy.
P-137676
mateczek
sprawdziłem
» 2015-09-19 19:09:41
sprawdziłem ale tylko dla kodu jak poniżej.


C/C++
main() {
    klasa obiekt;
    cout << obiekt;
}


Wydaje się ok!!! może spróbuj przebudować projekt.
Rebuild. Lub wyczyść wszystko i zbuduj odnowa (czasem tak się dzieje że coś nie gra i trzeba przebudować).

P-137684
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-09-19 20:04:37
Próbowałem tez czyścić kompilacje i budować od nowa. Pisałem to trzy razy od nowa. Wszystko działa ale jak dodam przeciążenie << to lipa. Opertory arytmetyczne są ok.
Dzięki za look'nięcie. Jak znajdę rozwiązanie to dam znać.
P-137687
notabigthreat
» 2015-09-19 20:10:40
Jak dokładnie wygląda log kompilacji?
P-137688
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-09-19 20:34:15
Jestem poza domem. Dokladnie w funkcji
friend & ostream operator <<
 mówi ze os jest niezdefiniowane, jakby byla literowka w nazwie zmiennej. Jutro wrzucę dokładny log.
P-137689
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-09-19 22:33:16
Ważność Kod Opis Projekt Plik Wiersz
Błąd C2065 "os": niezadeklarowany identyfikator operator cout g:\visual 2015\język c++\klasy\operator cout\operator cout\op_cout.cpp 26

Ważność Kod Opis Projekt Plik Wiersz
Błąd (aktywny) identyfikator "os" jest niezdefiniowany operator cout g:\Visual 2015\Język C++\Klasy\operator cout\operator cout\op_cout.cpp 26
 

Myślę że to może być błąd kompilatora.
P-137690
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-09-19 23:54:16
Już nie zawracam głowy. Przykład działa poprawnie.
Visual robił fochy po aktualizacji Azure. Przeinstalowałem na "świeżo" i hula.
Nie wiem co Azure ma do rzeczy, ale tylko tego nie aktualizowałem i wszystko działa.
Dzięki za chęci!!!
P-137700
« 1 »
  Strona 1 z 1