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

Wywołanie konstruktora domniemanego w funkcji i praca na składnikach obiektu.

Ostatnio zmodyfikowano 2016-12-24 13:07
Autor Wiadomość
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
C/C++
#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(); //.1
    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.
C/C++
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:
C/C++
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.
P-155353
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,
P-155354
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.
C/C++
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:
C/C++
class Klasa
{
    int i;
    int o;
public:
    Klasa( int a )
    {
        i = a;
        o = a;
    }
    Klasa()
    {
        cout << "domniemany!";
    }
};
int main()
{
    Klasa a;
}
P-155360
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();
P-155362
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?
P-155363
Gibas11
» 2016-12-24 12:50:15
No używając wcześniej napisanego konstruktora.
C/C++
#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;
}
P-155364
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 :))
P-155368
« 1 »
  Strona 1 z 1