[ Nedeljko @ 16.09.2016. 16:15 ] @
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.
[ jablan @ 16.09.2016. 17:05 ] @
Koji je realan problem u kome si naišao na ovakvu strukturu nasleđivanja i imenovanja?
[ Nedeljko @ 16.09.2016. 20:20 ] @
Nijedan. Samo me zanima kako da pristupim tom članu.
[ Branimir Maksimovic @ 16.09.2016. 22:31 ] @
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;
};
[ Nedeljko @ 17.09.2016. 08:07 ] @
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.
[ Branimir Maksimovic @ 17.09.2016. 11:47 ] @
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';
};

[ Nedeljko @ 17.09.2016. 12:34 ] @
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>?
[ Branimir Maksimovic @ 17.09.2016. 13:09 ] @
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.
[ Nedeljko @ 17.09.2016. 18:40 ] @
Znači operator razrešenja dosega ne može da se koristi za dvostruki osnovni atribut.




[ tupito @ 08.11.2016. 09:55 ] @
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.
[ Popaj96 @ 09.11.2016. 09:04 ] @
>