Portál AbcLinuxu, 10. května 2025 05:43
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ě“.
Řešení dotazu:
#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
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.
#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.
const char *z důvodů:
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.