latajacaryba Temat założony przez niniejszego użytkownika |
Wywołanie konstruktora domniemanego w funkcji i praca na składnikach obiektu. » 2016-12-24 01:52:09 Witam. Mam kod #include <iostream> using namespace std; class klasa { public: int a; int b; string info; klasa() { a = 0; b = 0; info = "przy pomocy domniemanego"; } klasa( int pier, int drug ) { a = pier; b = drug; info = "przy pomocy konstruktora konwertujacego"; } klasa( int pier, int drug, string inf ) { a = pier; b = drug; info = inf; } }; klasa dodaj( klasa pier, klasa drug ) { klasa wynik(); wynik.a = pier.a + drug.a; wynik.b = pier.b + drug.b; return wynik; } int main() { klasa a(); klasa wynik(); wynik = dodaj( a,( 3, 4 ) ); }
1. w tym miejscu wywołuje konstruktor domniemany zdefiniowany wcześniej. Wychodzą następujące błędy: ||=== Build: Debug in Laptop1 (compiler: GNU GCC Compiler) ===| C:\C++\Laptop1\main.cpp||In function 'klasa dodaj(klasa, klasa)':| C:\C++\Laptop1\main.cpp|31|error: request for member 'a' in 'wynik', which is of non-class type 'klasa()'| C:\C++\Laptop1\main.cpp|32|error: request for member 'b' in 'wynik', which is of non-class type 'klasa()'| C:\C++\Laptop1\main.cpp|33|error: could not convert 'wynik' from 'klasa (*)()' to 'klasa'| C:\C++\Laptop1\main.cpp||In function 'int main()':| C:\C++\Laptop1\main.cpp|39|warning: left operand of comma operator has no effect [-Wunused-value]| C:\C++\Laptop1\main.cpp|39|error: could not convert 'a' from 'klasa (*)()' to 'klasa'| C:\C++\Laptop1\main.cpp||In function 'klasa dodaj(klasa, klasa)':| C:\C++\Laptop1\main.cpp|34|warning: control reaches end of non-void function [-Wreturn-type]| ||=== Build failed: 4 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
Kiedy za to konstruujemy obiekt konstruktorem niedomniemanym - takich błędów nie ma. klasa dodaj( klasa pier, klasa drug ) { klasa wynik( 0, 0, "nie-domniemany" ); wynik.a = pier.a + drug.a; wynik.b = pier.b + drug.b; return wynik; }
To samo, kiedy jako argumentu funkcji 'dodaj' chce użyć obiektu zkonstruowanego konstruktorem domniemanym klasa a() . I ostatnie pytanie: klasa a( 1, 2, "info" ); klasa wynik(); wynik = dodaj( a,( 2, 1 ) );
Tu już naprawdę nawet się nie domyślam, czemu nie działa, jest przecież konstruktor konwertujący (ma 2 argumenty int), więc powinno działać. tymczasem: ||=== Build: Debug in Laptop1 (compiler: GNU GCC Compiler) ===| C:\C++\Laptop1\main.cpp||In function 'int main()':| C:\C++\Laptop1\main.cpp|40|warning: left operand of comma operator has no effect [-Wunused-value]| C:\C++\Laptop1\main.cpp|40|error: could not convert '(0, 1)' from 'int' to 'klasa'| ||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Pomijam już, dlaczego mnie ostrzega. Z góry dziękuję za pomoc. |
|
michal11 |
» 2016-12-24 02:09:31 klasa wynik(); to nie jest wywołanie konstruktora bezparametrowego tylko deklaracja funkcji o nazwie wynik zwracającej obiekt typu klasa i nie mająca argumentów. klasa( int pier, int drug ) to nie jest konstruktor konwertujący. Jeżeli chcesz dokonać konwersji to z jednego typu na drugi, nie ma czegoś takiego jak konwersja z dwóch typów na jeden jednocześnie. ( 3, 4 ) to nie jest wywołanie konstruktora tylko zwyczajne wzięcie dwóch wartości w nawias. Jak byś chciał żeby się zachowało coś takiego int( a, b ); ? Edit. trochę źle formatuje, to ma być deklaracja dwóch zmiennych int. A ostrzeżenia dostajesz bo wywołujesz tyko operatora, |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-24 12:22:16 Hmm... To po co właściwie jest konwersja, skoro klasa ma zwykle więcej niż 1 składnik? Czy w ogóle przydaje się coś takiego? np. class Przyklad { int zmienna1; int zmienna2; string zmienna3; float zmienna4 };
Jeśli się przydaje to kiedy? Nie łatwiej już przesłać obiekt? PS. jak wywołać konstruktor domniemany JAWNIE. Czyli NIE tak: class Klasa { int i; int o; public: Klasa( int a ) { i = a; o = a; } Klasa() { cout << "domniemany!"; } }; int main() { Klasa a; }
|
|
Gibas11 |
» 2016-12-24 12:43:47 | To po co właściwie jest konwersja, skoro klasa ma zwykle więcej niż 1 składnik? |
Konstruktor konwertujący powinien brać jeden parametr będący typem wbudowanym lub obiektem, przykładowo jeśli chcesz móc zainicjalizować klasę MoonMoon obiektem klasy Dog to robisz sobie właśnie konstruktor konwertujący. | jak wywołać konstruktor domniemany JAWNIE. Czyli NIE tak: |
Klasa a = Klasa(); |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-24 12:47:25 Rozumiem. A jak taki obiekt jednej klasy zainicjalizować obiektem innej? |
|
Gibas11 |
» 2016-12-24 12:50:15 No używając wcześniej napisanego konstruktora. #include <iostream>
struct Klasa1 { int zmienna; };
struct Klasa2 { double zmienna_d; Klasa2( Klasa1 obj ) { this->zmienna_d = obj.zmienna +.5; } };
int main() { Klasa1 obj1 { 6 }; Klasa2 obj2( obj1 ); std::cout << obj2.zmienna_d << std::endl; return 0; }
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-24 13:07:48 Dziękuję bardzo za wytłumaczenie. Temat zamykam. Smacznego karpia :)) |
|
| « 1 » |