Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pitanje u vezi višestrukog nasleđivanja

[es] :: C/C++ programiranje :: Pitanje u vezi višestrukog nasleđivanja

[ Pregleda: 2585 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Pitanje u vezi višestrukog nasleđivanja16.09.2016. u 16:15 - pre 91 meseci
Dakle, imamo sledeći kod:

Code (cpp):

struct A {
    int x;
};

struct B : public A {
    int x;
};

struct C : public A {
    int x;
};

struct D : public B, public C {
    int x;
};

// ...

D d;

static_cast<B&>(d).A::x = 1;
 


Kako izbeći pisanje "static_cast" i koristiti operator razrešenja dosega "::"? Sintaksa

Code (cpp):

d.B::A::x = 1;


ne prolazi.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja16.09.2016. u 17:05 - pre 91 meseci
Koji je realan problem u kome si naišao na ovakvu strukturu nasleđivanja i imenovanja?
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja16.09.2016. u 20:20 - pre 91 meseci
Nijedan. Samo me zanima kako da pristupim tom članu.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-76.bvcom.net.



+1064 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja16.09.2016. u 22:31 - pre 91 meseci
Za to se koristi virtuelno nasledjivanje, upravo je smisljeno zbog ovoga , tj diamond inheritance problema.

Code:

class A{
public:
    int x;
};

class B:virtual public A{
};
class C:virtual public A{
};

class D:public B,public C{
public:
    int x;
};

int main() {
    D d;
    d.x = 5;
    d.A::x = 6;
};
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja17.09.2016. u 08:07 - pre 91 meseci
Ne, to nije isto jer si ti u klasi D nasledio samo jedan ceo broj iz klase A, a ja sam dva. Mene zanima sintaksa za ono što sam pitao. Evo primera:

Code (cpp):

struct Device
{
    double speed;
};

struct Printer : public Device
{
};

struct Scanner : public Device
{
};

struct Copier : public Printer, public Scanner
{
};
 


U klasi Device imamo atribut speed, koji u klasi Printer znači brzinu štampe, a kod uređaja Scanner brzinu skeniranja. Uređaj Copier ima obe funkcije i posebno brzinu štampe, a posebno brzinu skeniranja. Tu bi virtuelno nasleđivanje smetalo. Ovo bi se naravno moglo rešiti i bez nevirtuelnog nasleđivanja:

Code (cpp):

struct Device
{
    virtual double& speed() = 0;
};

struct Printer : virtual public Device
{
    double printingSpeed;

    double& speed() override { return printingSpeed; }
};

struct Scanner : virtual public Device
{
    double scanningSpeed;

    double& speed() override { return scanningSpeed; }
};

struct Copier : public Printer, public Scanner
{
};
 


Međutim, mene zanima sintaksa za ono što sam pitao.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-76.bvcom.net.



+1064 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja17.09.2016. u 11:47 - pre 91 meseci
Pa ako hoces dupli bazni objekt to onda ide otprilike ovako:

Code:

#include <iostream>

class Device{
public:
    virtual int speed()=0;
};

class Scanner:public Device{
public:
    int speed_;
    virtual int speed(){ return speed_; }
    Device& base(){ return *this; }
};
class Printer:public Device{
public:
    int speed_;
    virtual int speed(){ return speed_; }
    Device& base(){ return *this; }
};

class Copier:public Scanner,public Printer{
};

int main() {
    Copier d;
    d.Printer::speed_ = 6;
    d.Scanner::speed_ = 7;
    Device& as_printer = d.Printer::base();
    Device& as_scanner = d.Scanner::base();
    std::cout<<as_printer.speed()<<'\n'<<as_scanner.speed()<<'\n';
};

 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja17.09.2016. u 12:34 - pre 91 meseci
Da, hoću dupli bazni atribut. Znam kako da mu pristupim na više načina. U primeru iz prve poruke bi neki od načina bili:

Code (cpp):

D d;

// Prvi nacin:
static_cast<B&>(d).A::x = 1;
// Drugi nacin:
((B&)d).A::x = 1;

// Treci nacin:
B &b = d;

b.A::x = 1;

// Cetvrti nacin, koji ne radi:
// d.B::A::x = 1;
 


Mene zanima da li može bez toga, sa dve primene operatora razrešenja dosega "::" nalik na četvrti način.

Bajdvej, da li su sva dva načina ista? Da li je opertor konverzije (T) isto što i static_cast<T>?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p1-76.bvcom.net.



+1064 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja17.09.2016. u 13:09 - pre 91 meseci
Scope resolution operator ne odredjuje objekt nego samo sintaksu, eg koristi se i za namespace...
Sto se tice cast-a: C style cast pokriva 3 od 4 moguca cast-a u C++, tako da je preporucljivo da se koristi specifican tip zbog eventualnih gresaka.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja17.09.2016. u 18:40 - pre 91 meseci
Znači operator razrešenja dosega ne može da se koristi za dvostruki osnovni atribut.





Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

tupito
Vladan Milivojevic
Beograd

Član broj: 55195
Poruke: 54
*.cws.sco.cisco.com.



Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja08.11.2016. u 09:55 - pre 89 meseci
Scope resolution operator se upravo koristi u C++ za razresenje dijamant strukture, samo si ga pogresno koristio za tvoj primer:

Code:
    
    d.B::x = 2;
    d.C::x = 3;

    std::cout << "B::X = " << d.B::x << std::endl;
    std::cout << "C::X = " << d.C::x << std::endl;


C cast ti je ekvivalentan reinterpret_cast, static cast vrsi staticku proveru tipova pa je sigurniji.
 
Odgovor na temu

Popaj96
Nikola Popadić
Ne radim
Crvenka,Srbija

Član broj: 285064
Poruke: 10
*.com
Via: [es] mailing liste

Sajt: programiranje-korakpokora..


Profil

icon Re: Pitanje u vezi višestrukog nasleđivanja09.11.2016. u 09:04 - pre 89 meseci
>
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pitanje u vezi višestrukog nasleđivanja

[ Pregleda: 2585 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.