abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 0
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 16
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 2
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 767 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: C++ vrácení konstatního textu z funkce

20.11.2010 15:31 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
C++ vrácení konstatního textu z funkce
Přečteno: 635×
Po delší době se zabývám něčím „základním“ a narazil jsem si na záležitost vrácení konstantního textu z virtuální fce.

Tento příklad asi není moc super s ohledem na bezpečnost
virtual const char* getText() const
{
  const char *name = "text";
  return name;
};
Tento už je asi lepší (nebo ne?)
virtual void getText(std::string &name) const
{
  name = "text";
};
ale mě by zajímalo jak se takové věci dělají obecně „správně“.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Řešení dotazu:


Odpovědi

20.11.2010 16:07 martyone | skóre: 18
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Zkuste si přeložit a spustit tento krátký prográmek:
#include <stdio.h>

void x() {      const char *abc = "abc"; printf("x: %p/%p\n", &abc, abc); }
void y() { x(); const char *abc = "abc"; printf("y: %p/%p\n", &abc, abc); }
void z() { y(); const char *abc = "abc"; printf("z: %p/%p\n", &abc, abc); }

int main()
{
	z();
	return 0;
}
To by Vás mělo přesvědčit, že tohle..
virtual const char* getText() const
{
  return "text";
};
..je v naprostém pořádku :-)
20.11.2010 16:10 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Nepochybuji o funkčnosti…, získáte tím ale ukazatel na místo, na které se můžete pokusit zapsat, tj. není to defensivní kopie.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
20.11.2010 16:29 mrk
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce

A kde je problém? Veď tá funkcia vracia const char*, čiže pointer na konštantné pole znakov. (aj keď, dá sa to obísť pomocou const_cast)

A prečo nepoužijete návratový typ const std::string (hodnota, nie referencia)? std::string sa riadi zásadou copy-on-write, čiže samotné vytvorenie kópie je lacné, akurát sa možno zbytočne pracuje s počítadlom odkazov.

20.11.2010 17:23 martyone | skóre: 18
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Jak řekl mrk, pokusit zapsat se můžete, ale bez const_cast to nepůjde a to je jiná kapitola. A pak, kus kódu který jsem napsal není o prokázání funckčnosti ale správnosti :-)
21.11.2010 11:08 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Trošku jsem se snažil lépe vysvětlit vo co mi go níže.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
23.11.2010 01:13 vlastagf | skóre: 11
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Nevraci to nahodou pointer na lokalni promennou?
23.11.2010 01:19 vlastagf | skóre: 11
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Resp. co vlastne vola?
return "text";
Alokuje se dynamicke pole nebo ne?
23.11.2010 01:27 Jirka P
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Ne, proboha!

return "text";

vrací ukazatel na globální, konstantní pole.
20.11.2010 19:51 __dark__
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Oba příklady jsou správně, ale dělají neco jiného. V prvním příkladu vracíš ukazatel na "text", v druhém vytváříš jeho kopii.
21.11.2010 10:59 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Vím co ty fce dělají a ten rozdíl mi jde, ... je možné napsat další roj variant (neřeším správnost s ohledem na syntaxi a práce s pamětí :)).
Zajímalo mě jak se to bezpečně reší v praxi v roce 2010 :).
Varianta s char * umožní získat ukazatel do konstanty.
#include <iostream>
const char* getText() { return "Text"; }
int main()
{
  std::cout << getText() << std::endl;
  char *ch = (char *) getText();
  ch[0] = 't';
  std::cout << getText() << std::endl;
  return 0;
}
... že to skončí s Segmentation fault, je jiná záležitost.

2. Příklad již dává defensivní kopii, takže asi OK, ale zas práce s tím může být pracnější (víc psaní).
Starší kódy jsou plné vracení ukazatele na konstatní řetězec(char[]).
Vzhledem k tomu, že to má být součástí veřejného rozhraní, tak jsem chtěl zadiskutovat, jak je to správné řešit s ohledem na správný/bezpečný návrh a pohodlné použití.
Ono asi bude rozumná, mnou úmyslně neuvedená varianta a zde vzpomenutá varianta s vracením std::string hodnotou.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
21.11.2010 12:24 jekub
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
char *ch = (char *) getText();

1. chcete pouzivat c++, takze kdyz tak const_cast

2. je to vedome poruseni restrikce const char *. Fce vracejici ukazatel na konstantu je zcela v poradku. Ostatne pokud budete chtit, muzete zpusobit pad aplikace i v pripade navratu std::string hodnotou...
21.11.2010 14:55 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
ad. 1 - Já ano(i když si tím někdy nejsem jistý - jestli chci :) ), ale jak jsem psal jedná se o rozhraní a nevím kdo jak jej bude používat :)
ad. 2 - jo je to vědomé porušení a asi by to mělo stačit k tomu, že tím pádem je to „dostačující“ argument proto se tím nezabývat
Možná jsem to měl napsat nějak jinak, mě hlavně zajímá, která s variant je nejrozumnější, víceméně nenavádějící k jednoduchým chybám a obecně přijatelná.
Osobně preferuji bod 1. tj. vrácení ukazatele na konstantu, bo je to takové „milé“ a historicky mi vlastní :).
Nicméně setkávám se v novějších zdrojích s jinými variantami, což se dřív tak nevidělo, a protože fčul je rozhodnutí na mě, ale nejedná se o vnitřní záležitost, ale o veřejné rozhraní, tak jsem raději položil tento dotaz abych se něco dozvěděl.

Já vím, že v zásadě jde o nic a jsou daleko důležitější věci, ale ve své podstatě mezi některými variantami nevidím rozdíl co do funkčnosti/použitelnosti a chtěl jsem vědět proč to někdo dělá tak a někdo tak --- ty důvody mě zajímají, že by žádné nebyly?
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
21.11.2010 20:14 jekub
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Ty duvody jsou podle me tehoz druhu jako rozhodovani mezi tim, zda se ta funkce v prikladu bude jmenovat getText, GetText nebo treba get_text. Hlavni podle me je, aby byl styl v ramci Vaseho rozhrani konzistentni.
21.11.2010 19:56 biolog
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Obě dělají zhruba totéž.

Použít obyčejný Cčkový cast v C++ je možné a podporované. Ale C++ umí jemnější casty, lépe z nich lze poznat, co autor kdysi zamýšlel (jen odstranit const-nost, jen přetypovat na potomka a ne z čehokoliv, ...). Samozřejmě každé přetypování je určité nebezpečí. Když někdo udělá to co v příspěvku #6, dobře mu tak.

Chytré string používají copy-on-write a počítání referencí (nebo kombinaci s eager-copy). Pokud by byl ten vracený string velký, vytvářela by se pokaždé nová kopie. (Chytré stringy nemohou zvyšovat počitadlo referencí u char* stringu, protože ho nemá.) V tom případě je místo statického C stringu mít statický std::string a vracet jeho (líné) kopie.

Varianta getText(std::string &name) se hůř používá, protože volající musí mít lokální proměnnou na něco, co ho možná nezajímá. Třeba by chtěl zavolat foo(getText()) a nemůže.

Když tu druhou variantu upravíte aby vracela std::string (bez &), a ne void, budou skoro stejně dobré. Ledaže by volající preferovali CString (MFC), QString (Qt), wxString (wxWidgets), GString (GTK) nebo bůhvíco.
21.11.2010 20:16 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
A otočme to, co by jste použil v tomto případě a proč - snad to z někoho vytáhnu :).
(Vracíme ASCII řetězec „vyšší“ typy nepřichází v úvahu, na výběr je jen char* nebo std::string).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
22.11.2010 18:38 martyone | skóre: 18
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Pokud teda jde jen o styl, upřednostnil bych API vracející nějaký chytrý string. Práce s hodnotou je pohodlnější, nepotřebuje komentáře ohledně zodpovědnosti o dealokaci, a implementace se sdílenými daty nepřinášejí zas tak velké zatížení.
23.11.2010 18:06 extremni lama | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
ja bych vracel "char const *", pokud nemas duvod vracet std::string. Precejenom kdyz z toho uzivatel bude chtit udelat string, tak to neni problem a bude to efektivnejsi

btw. tim copy-on-write o kterym pise "biolog" bych si nebyl tak jistej. Pokud vim tak vetsina STL implementaci to nepouziva protoze to zpusobuje problemy u multithread aplikaci...
The enemy of my enemy is still my enemy.
23.11.2010 20:01 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C++ vrácení konstatního textu z funkce
Děkuji všem, rozhodl jsem se zůstat při starém tudíž, vracet
const char *
z důvodů:
  • Dicki sem to tak dělal, nebyl-li ke změně nějaký vyšší důvod
  • Je to takové jednoduché, z mého pohledu „průhledné“
  • Nikdo nenamítl nic, co by to nějak shodilo
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.