Shared_ptr - operator pretypovani – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Shared_ptr - operator pretypovani – C / C++ – Fórum – Programujte.comShared_ptr - operator pretypovani – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Koudis
~ Anonymní uživatel
145 příspěvků
6. 7. 2012   #1
-
0
-

ahojky,
tak prvni dotaz na nove forum

shared_ptr<T> nema pretizeny operator pretypovani T*. Nejak jsem si uvedomil, ze ho potrebuji . Existuje v standardu nejaka podobna trida, ktera implementuje i "operator T*()?"
Dekuji moc vsem za odpovedi.


Koudis

Nahlásit jako SPAM
IP: 85.92.56.–
Reklama
Reklama
ondra.holub+1
Stálý člen
7. 7. 2012   #2
-
0
-

Přetypování? Myslíš metodu, která vrátí obyčejný ukazatel? Ta se jmenuje get(). Pokud myslíš něco jiného, tak to rozveď.

Nahlásit jako SPAM
IP: 85.207.23.–
Koudis
~ Anonymní uživatel
145 příspěvků
7. 7. 2012   #3
-
0
-

#2 ondra.holub
Ahoj,

nene, vim ze shared_ptr ma metodu get(). Ja potrebuji, aby mela i clenskou metodu "operator T*()?" // je celkem logicke, ze ji shared_ptr nema // 

Koudis

Nahlásit jako SPAM
IP: 85.92.56.–
Martin Kozibrátka0
Stálý člen
7. 7. 2012   #4
-
0
-

Z jakého důvodu? Aby ti vracela přímo hodnotu?

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
ondra.holub+1
Stálý člen
7. 7. 2012   #5
-
0
-

#3 Koudis
Jestli jde jenom o to, aby se ten shared_ptr dal předávat jako parametr funkcím, které požadují obyčejný ukazatel, tak tam musíš strčit ten get. Pokud se totiž začnou mixovat "chytré" ukazatele s obyčejnými, tak je potřeba to dělat s rozmyslem a člověk musí vědět přesně, co se uvnitř té funkce děje. Ta funkce může na ten (obyčejný) ukazatel zavolat třeba delete nebo z něj může udělat další instanci chytrého ukazatele. To obvykle rozbije celý mechanismus reference countingu a program nakonec začne padat - obvykle na naprosto nečekaném místě.

Jak píšeš, je logické, že tento operátor tam není.

Nahlásit jako SPAM
IP: 85.207.23.–
ondra.holub+1
Stálý člen
7. 7. 2012   #6
-
0
-

#3 Koudis
Pořád si ještě můžeš udělat vlastní třídu zděděnou ze std::shared_ptr. Jenom znovu opíšeš konstruktory a přidáš ten operátor přetypování.

template<typename T>
class my_shared_ptr: public std::shared_ptr<T>
{
    typedef
        std::shared_ptr<T> Base;

public:
    explicit my_shared_ptr(T* ptr): Base(ptr) { }

    operator T*()
    {
        return Base::get();
    }

    operator const T*() const
    {
        return Base::get();
    }

};

Ale je třeba si uvědomit nebezpečí, která jsem zmínil v předešlé odpovědi.

Nahlásit jako SPAM
IP: 85.207.23.–
Koudis
~ Anonymní uživatel
145 příspěvků
7. 7. 2012   #7
-
0
-

#6 ondra.holub
prepisovat konstruktory asi moc pekna vec nebude. Lepsi bude, hodit do tridy jako clenskou promennou ukazetal na shared_ptr...

Me spise zajimalo, jestli nejaka takove trida neexistuje primo v STL. Abych ji nemusel zbytecne psat...

Koudis

Nahlásit jako SPAM
IP: 85.92.56.–
ondra.holub+1
Stálý člen
9. 7. 2012   #8
-
0
-

#7 Koudis
Ukazatel na shared_ptr? Proč ukazatel? To nějak popírá smysl toho shared_ptr.

> Me spise zajimalo, jestli nejaka takove trida neexistuje primo v STL.

No, možná existuje - určitě nejsem super znalec STL. Ale nevím o ní a tipnul bych si, že s výše zmíněných důvodů tam ani nebude.

Ale napsat si vlastní je celkem v pohodě - je to docela prima cvičení na práci se šablonami. Je možné parametrizovat variantu implementace (počítadlo uložené přímo v datech odkazovaných obyčejným ukazatelem / počítadlo někde vedle (minimálně 2 varianty) / lineární seznam všech použitých instancí místo počítadla (toto moc praktické není)). Dále lze třeba parametrizovat kontrolu na 0 ptr, zamykání...

Nahlásit jako SPAM
IP: 194.138.12.–
Koudis
~ Anonymní uživatel
145 příspěvků
9. 7. 2012   #9
-
0
-

#3 Ondra
Ukazatel na shared_ptr? Proč ukazatel? To nějak popírá smysl toho shared_ptr.

nepopira. 

template <typename T = float>
class shared_ptr_help
{
    public:
       ~shared_ptr_help() { delete shared_ptr_pointer; }
       shared_ptr_help(shared_ptr<T>* pointer): 
         shared_ptr_pointer(pointer) {}

       operator T*() { return shared_ptr_pointer->get(); }


    private:
       shared_ptr<T>* shared_ptr_pointer;
};

pak na danem miste vytvorim pomoci new nejakou instanci shared_ptr, vlozim ji do shared_ptr_help a dal se o pointer nestaram (shared_ptr_help vytvorim v "lokalnim" zasobniku).

Tato trida ma jako jedinne za ukol implementaci operatoru pretypovani. MOhli bychom pridat i metodu Getshared_ptr_pointer() const...

Nahlásit jako SPAM
IP: 85.92.56.–
ondra.holub+1
Stálý člen
9. 7. 2012   #10
-
0
-

#9 Koudis
A k čemu je tam ten pointer na shared_ptr? Je tam zbytečná alokace, je potřeba zakázat copy construktor a operátor přiřazení a celkově to nedělá nic jiného, než toto:

template <typename T = float>
class shared_ptr_help
{
    public:
       shared_ptr_help(const shared_ptr<T>& pointer): 
         pointer(pointer) {}

       operator T*() { return pointer.get(); }


    private:
       shared_ptr<T> pointer;
};
Nahlásit jako SPAM
IP: 212.96.189.–
Koudis
~ Anonymní uživatel
145 příspěvků
9. 7. 2012   #11
-
0
-

#10 ondra.holub
to je pravda :). Ja jsem zvykli davat jine tridy jako clenske promenne pomoci ukazatele. Nejak nemam rad, ze se pouziva pri inicializaci objektu konstruktor shared_ptr<T>()...

Nahlásit jako SPAM
IP: 85.92.56.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 203 hostů

Podobná vlákna

Operator přetypování — založil Jurin

Přetypování. — založil jisla

C# přetypování — založil ondra

Přetypování — založil Keyzio

Pretypovani v C — založil TuTi_fruTi

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý