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

Operator <<

Ostatnio zmodyfikowano 2016-06-20 16:45
Autor Wiadomość
danny
Temat założony przez niniejszego użytkownika
Operator <<
» 2016-06-19 20:33:34
Witam, dopiero zaczynam naukę (wręcz jestem kompletnie zielony) C++ i zmagam się z nastepującym zadaniem:

1. Niech będzie dana klasa wektor zdefiniowana:

class wektor {
int  *x, *y, *z;
public:
wektor ...
           }
Napisać:
• Konstruktor przydzielający pamięć dla wektora oraz inicjujący wartości x, y, z.
• Funkcję operatorową = umożliwiającą kopiującej wartości współrzędnych wektora,
• Funkcję operatorową << wypisującą wektor w postaci [ x y z] np. [3 3 6]

Nie wiedziałem nawet jak zacząć to zadanie, ale na podstawie innego programu napisałem coś takiego (bez wskaźników, bo to tym bardziej utrudnia mi zadanie.):

 (program się nie kompiluje):
#include <iostream>

using namespace std;

class wektor {
int  x, y, z;
public:
wektor(int x, int y, int z):x(x), y(y), z(z){};
        friend std::ostream& operator << (std::ostream& out, wektor& x);
          };

          std::ostream& operator << (std::ostream& out, wektor& wek)
          {
              out << wek.x;
              out << wek.y;
              out << wek.z;
              return out;
          }



int main()
{
    wektor heh(3,4,5);
    return 0;
}

Chciałbym wiedzieć co zrobiłem źle, i jak powinno być to zrobione. Pozdrawiam.
P-149277
carlosmay
» 2016-06-19 20:55:07
Chciałbym wiedzieć co zrobiłem źle
A co nie działa?

C/C++
#include <iostream>

class Wektor
{
    int * x_;
    int * y_;
    int * z_;
public:
    Wektor()
        : x_
    { new int( 0 ) },
    y_ { new int( 0 ) },
    z_ { new int( 0 ) }
    { }
   
    Wektor( int x, int y, int z )
        : x_
    { new int( x ) },
    y_ { new int( y ) },
    z_ { new int( z ) }
    { }
   
    ~Wektor()
    {
        delete x_;
        delete y_;
        delete z_;
    }
   
    Wektor( const Wektor & other )
        : x_
    { new int( * other.x_ ) },
    y_ { new int( * other.y_ ) },
    z_ { new int( * other.z_ ) }
    { }
   
    Wektor & operator =( const Wektor & other )
    {
        x_ = new int( * other.x_ );
        y_ = new int( * other.y_ );
        z_ = new int( * other.z_ );
       
        return * this;
    }
   
    friend std::ostream & operator <<( std::ostream & os, const Wektor & wektor )
    {
        return os << * wektor.x_ << ' ' << * wektor.y_ << ' ' << * wektor.z_;
    }
};

auto main()->int
{
    Wektor wsp1( 2, 6, 4 );
   
    Wektor wsp2;
    wsp2 = wsp1;
   
    std::cout << "wsp1: " << wsp1 << "\nwsp2: " << wsp2 << '\n';
}

edit:
PS:
jeszcze lepiej korzystać ze smart pointerów, np.std::shared_ptr
P-149280
danny
Temat założony przez niniejszego użytkownika
» 2016-06-19 23:07:35
Nie ma dostępu do składowych x, y i z,
A błędy wyglądają tak o:
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:6:8: error: 'int wektor::x' is private
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:14:26: error: within this context
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:6:11: error: 'int wektor::y' is private
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:15:26: error: within this context
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:6:14: error: 'int wektor::z' is private
C:\Users\STATEK\Desktop\obiektowe\test\zadanie\main.cpp:16:26: error: within this context
P-149285
carlosmay
» 2016-06-20 00:49:55
Nie ma dostępu do składowych x, y i z,
Do składowych prywatnych należy odwoływać się za pośrednictwem metod lub funkcji zaprzyjaźnionych.

W poprzednim poście zamieściłem działający kod.
Zresztą twój też się kompiluje.

Można przyczepić się do tej linii:
C/C++
wektor( int x, int y, int z )
    : x( x )
     , y( y )
     , z( z )
{ };
Argumenty i właściwości klasy mają te same nazwy, co może być mylące.
P-149287
danny
Temat założony przez niniejszego użytkownika
» 2016-06-20 16:04:02
Kopiując twój kod wywala mi całą masę błędów, to samo dzieje się kiedy chcę skompilować mój kod. Czym to może być spowodowane?

C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp: In constructor 'Wektor::Wektor()':
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:10:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:12:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:13:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp: In constructor 'Wektor::Wektor(int, int, int)':
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:21:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:23:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:24:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp: In copy constructor 'Wektor::Wektor(const Wektor&)':
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:35:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:37:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:38:5: error: expected '{' before 'z_'
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp: At global scope:
C:\Users\STATEK\Desktop\obiektowe\test\here_dymy\main.cpp:57:1: error: expected unqualified-id before '{' token
P-149304
carlosmay
» 2016-06-20 16:28:04
Włącz w opcjach kompilatora obsługę standardu C++11 lub nowszego.
Twój kompilator nie obsługuje klamer przy inicjalizacji.
Można zamienić je na nawiasy okrągłe.

Nie pamiętam jak jest listą inicjalizacyjną.
Jak włączysz C++11 problemy znikną.
P-149306
danny
Temat założony przez niniejszego użytkownika
» 2016-06-20 16:45:49
Dziekuję bardzo za pomoc, już wszystko śmiga, Pozdrawiam.
P-149310
« 1 »
  Strona 1 z 1