.[ ČeskéHry.cz ].
konverze z a do POD typu

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 19. červenec 2015, 13:53:05    Předmět: konverze z a do POD typu Odpovědět s citátem

Zdravím,
mám POD typ (říkejme mu neV3 Wink ) reprezentující třísložkový vektor a spoustu funkcí, které ho berou jako parametry nebo vracejí.

Já bych ale rád místo něj používal proměnné typu glm::vec3. Takže potřebuju konverzi oběma směry. glm pochopitelně nechci měnit, takže se nabízí možnost vytvořit neV3::operator glm::vec3() const; a konstruktor neV3(const glm::vec3& v);

ALE je tam háček, a to právě v konstruktoru. POD typy nemohou mít konstruktory.

Jsem v pasti? Musím vytvořit nějakou explicitní funkci to_neV3(glm::vec3)? Nebo je na to nějaký trik?

A abych nezapomněl, nemůžu použít C++11.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1036

PříspěvekZaslal: 19. červenec 2015, 15:19:50    Předmět: Odpovědět s citátem

hm a co takto
kód:
 neV3& operator=(const glm::vec3 &d)

_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 536

PříspěvekZaslal: 19. červenec 2015, 15:56:57    Předmět: Re: konverze z a do POD typu Odpovědět s citátem

frca napsal:
Zdravím,
mám POD typ (říkejme mu neV3 Wink ) reprezentující třísložkový vektor a spoustu funkcí, které ho berou jako parametry nebo vracejí.

No a jaký je důvod, že to musí být zrovna POD? Jinak sis totiž odpověděl sám Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 19. červenec 2015, 16:30:51    Předmět: Odpovědět s citátem

Kvůli použití v unionu (ta knihovna je tak navržená, já jsem ji nepsal).
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 19. červenec 2015, 16:38:44    Předmět: Odpovědět s citátem

nou napsal:
hm a co takto
kód:
 neV3& operator=(const glm::vec3 &d)


Nefunguje:
kód:
// do not change A or C, only B

class A
{
public:
    A(float f_) { f = f_; }
    float f;
};

class B
{
public:
    //B() {}
    int i;

    B& operator=(const A &a)
    {
        i = a.f;
        return *this;
    }

    operator A() const
    {
        return A(i);
    }
};

class C
{
    union c
    {
        int i;
        B b;
    };
};

B compute(const B& b)
{
    return b;
}

int main()
{
    A a = compute(A(5));

    return 0;
}



kód:

../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:44:23: error: invalid initialization of reference of type 'const B&' from expression of type 'A'
     A a = compute(A(5));
                       ^
../conv_test/main.cpp:37:3: error: in passing argument 1 of 'B compute(const B&)'
 B compute(const B& b)
   ^
../conv_test/main.cpp:44:7: warning: unused variable 'a' [-Wunused-variable]
     A a = compute(A(5));
       ^

_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 536

PříspěvekZaslal: 19. červenec 2015, 17:11:57    Předmět: Odpovědět s citátem

frca napsal:
Nefunguje:

Zkus
kód:

A a;
a = compute(A(5));

Není to asi úplně to, co chceš, ale...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 19. červenec 2015, 20:04:31    Předmět: Odpovědět s citátem

Pořád nic...
kód:
../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:46:21: error: invalid initialization of reference of type 'const B&' from expression of type 'A'
     a = compute(A(5));
                     ^
../conv_test/main.cpp:38:3: error: in passing argument 1 of 'B compute(const B&)'
 B compute(const B& b)
   ^

Edit: No on je problém v konverzi A -> B, takže dává smysl, že chybová hláška je identická...

A jen pro pořádek, toto taky nefunguje:
kód:
// do not change A or C, only B

class A
{
public:
    A() {}
    A(float f_) { f = f_; }
    float f;
};

class B
{
public:
    //B() {}
    int i;

    B& operator=(const A &a)
    {
        i = a.f;
        return *this;
    }

    operator A() const
    {
        return A(i);
    }
};

class C
{
    union c
    {
        int i;
        B b;
    };
};

B compute(const B& b)
{
    return b;
}

int main()
{
    A a;
    B b = A(5);
    a = compute(b);

    return 0;
}



kód:
../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:46:14: error: conversion from 'A' to non-scalar type 'B' requested
     B b = A(5);
              ^

_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1481
Bydliště: Telč

PříspěvekZaslal: 20. červenec 2015, 08:28:12    Předmět: Odpovědět s citátem

Zkoušel jsem a taky mě nic nenapadá. Leda snad udělat nad A ještě nějaký wrapper (pokud A nemůžeš měnit). Na druhou stranu myslím, že explicitní konvertovací funkce vůbec neni na škodu. Když spojuješ dva systémy dohromady, tak je to podle mě i čistší - při psaní si pak snáz uvědomíš, kde se co potkává. Když tu konverzi zabalíš do nějaký statický třídy, tak stejně časem zjistíš, že se ti toto místo hodí i na další funkce.

kód:
class AB
{
public:
    static A ToA(const B &b);
...něco dalšího
};

_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 26. červenec 2015, 23:02:58    Předmět: Odpovědět s citátem

Nakonec jsem přetížil unární operátor vlnovku. Oproti funkci to má výhodu, že ušetřím jedny závorky. Prostě pragmatická ochcávka. Mnohem jednodušší by bylo vytvořit operátor konverze globálně (jako jsem teď přetížil globálně operátor vlnovka), ale to kdo ví proč v C++ nejde. Blame Stroustrup.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1481
Bydliště: Telč

PříspěvekZaslal: 27. červenec 2015, 08:48:49    Předmět: Odpovědět s citátem

Neni to trochu prasečinka? :-) Co tím získáš, kromě nepřehlednosti?
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1410

PříspěvekZaslal: 28. červenec 2015, 21:35:51    Předmět: Odpovědět s citátem

Je. Když zbyde čas, přetížím všechny existující funkce, aby braly jako parametry / vracely rovnou glm typy. Tím se to vyřeší.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1481
Bydliště: Telč

PříspěvekZaslal: 29. červenec 2015, 07:32:50    Předmět: Odpovědět s citátem

No, nevím sice, jaký přesně kód máš, ale přetěžovat všechny ty funkce, to taky neni ideál. Zvětšíš tim provázanost knihoven, možná přidáš nějakou tu chybu a zošklivíš interface. Raději to odděl architektonicky (třeba nějaký pojítko, nebo wrapper) a normálně ty typy konvertuj. Neni na tom opravdu nic zlého a zpoždění při konverzi je prakticky neměřitelné. Pokud to bude udělané dobře, tak nakonec zjistíš, že tu konvertovací funkci potřebuješ jen na málo místech.

Co jsem napsal, ber s rezervou. Představuju si to totiž podobně, jako když jsem svůj fyzikální systém rouboval na bullet a kolegův engine ;-).
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna