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. |
|
carlosmay |
» 2016-06-19 20:55:07 Chciałbym wiedzieć co zrobiłem źle |
A co nie działa? #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 |
|
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 |
|
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: 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. |
|
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 |
|
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ą. |
|
danny Temat założony przez niniejszego użytkownika |
» 2016-06-20 16:45:49 Dziekuję bardzo za pomoc, już wszystko śmiga, Pozdrawiam. |
|
« 1 » |