Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 3.604 pregleda

Najnovija ↓

Pitanje u vezi višestrukog nasleđivanja 16.09.2016. u 17:15 · pre 123 meseca #1
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Pitanje u vezi višestrukog nasleđivanja 16.09.2016. u 21:20 · pre 123 meseca #3
Nijedan. Samo me zanima kako da pristupim tom članu.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Pitanje u vezi višestrukog nasleđivanja 16.09.2016. u 23:31 · pre 123 meseca #4
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;
};
Re: Pitanje u vezi višestrukog nasleđivanja 17.09.2016. u 09:07 · pre 123 meseca #5
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Pitanje u vezi višestrukog nasleđivanja 17.09.2016. u 12:47 · pre 123 meseca #6
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';
};

Re: Pitanje u vezi višestrukog nasleđivanja 17.09.2016. u 13:34 · pre 123 meseca #7
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>?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Pitanje u vezi višestrukog nasleđivanja 17.09.2016. u 14:09 · pre 123 meseca #8
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.
Re: Pitanje u vezi višestrukog nasleđivanja 17.09.2016. u 19:40 · pre 123 meseca #9
Znači operator razrešenja dosega ne može da se koristi za dvostruki osnovni atribut.




Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Pitanje u vezi višestrukog nasleđivanja 08.11.2016. u 10:55 · pre 121 mesec #10
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme