Inicializace pointeru v konstruktoru třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Inicializace pointeru v konstruktoru třídy – C / C++ – Fórum – Programujte.comInicializace pointeru v konstruktoru třídy – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
hlucheucho+10
Posthunter
25. 5. 2013   #1
-
0
-

Ahoj,

mám problém s inicializací konstruktoru třídy: 

class Trida
{
  public:
    char *p;
    char hlavicka[13];

    Trida();
};


Trida::Trida:p(hlavicka)
{
}
 

ještě jsem zkusil

Trida::Trida:
{
  p = hlavicka;
}

Jak mám inicializovat p aby ukazoval na pole hlavicka?

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Reklama
Reklama
vitamin+8
Grafoman
25. 5. 2013   #2
-
0
-

#1 hlucheucho
 

Trida::Trida():p(hlavicka){}

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
crazy
~ Moderátor
+10
Grafoman
25. 5. 2013   #3
-
0
-

#1 hlucheucho
 

Trida::Trida()
	: p(hlavicka)
{
}
Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
hlucheucho+10
Posthunter
25. 5. 2013   #4
-
0
-

Závorky se mi při přepisování vytratily, omlouvám se.

To právě nefunguje. p ukazuje jinam, tam zapíše data a hlavicka ty data neobsahuje. Překvapivě nedojde k vyjímce.

IDE  C++ Builder 2010

Pokud zkusím

Trida::Trida():p(NULL)

p je správně na NULL

hu

Nahlásit jako SPAM
IP: 188.95.60.–
vitamin+8
Grafoman
25. 5. 2013   #5
-
0
-

#4 hlucheucho
Co ti vypise toto:

class Trida{
    public:
	char *p;
	char hlavicka[13];

	Trida():p(hlavicka){
		std::cerr << std::boolalpha << (p == hlavicka) << std::endl;
	}
};

int main(){
	Trida t;
}

?

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
25. 5. 2013   #6
-
0
-

jsem zkusil hlavicka udělat dynamicky a s tím to funguje.

C++ Builder mi napsal chybu cerr is not member of std

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
25. 5. 2013   #7
-
0
-

   

Trida::Trida()
{
  strcpy(hlavicka, "ahoj");
  p = hlavicka;
}

taky funguje.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
26. 5. 2013   #8
-
0
-

Pokud instanci vytvořím staticky, p se nastaví správně. Problém vzniká při vkládání do kontejneru:

std::vector<Trida()> vektor;

vektor.push_back(Trida());

Očekával jsem, že dojde k vytvoření instance třídy ve vektoru inicializované na hodnoty dané v konstruktoru. 

Jde vytvářet instance přímo do vektoru nebo je musím vytvořit mimo vektor a do vektoru kopírovat? Nenapsal jsem kopírovací konstruktor třídy, používá se defaultní, v domnění, že k žádnému kopírování nedochází.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
vitamin+8
Grafoman
26. 5. 2013   #9
-
0
-

#8 hlucheucho
V c++03 a starsom sa moze do vektoru vkladat prvok len kopirovanim (vola sa len kopirovaci konstruktor).

V c++11 existuje metoda emplace_back() ktora pouziva variadic template parametre pomocou ktorych sa mozu volat aj ine konstruktory.

template parameter vektoru ma byt trieda, nie jej instancia, takze:

std::vector<Trieda> vector;	//Trieda bez zatvoriek
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
26. 5. 2013   #10
-
0
-

C++ Builder 2010 standart C++11 nepodporuje   . Takže mám 2 možnosti:
- vytvořit instanci a tu vkládat do vektoru, je potřeba kopírovací konstruktor
- vytvořit dynamicky instanci a do vektoru ukládat jen ukazatele (asi bude efektivnější)

hu

Nahlásit jako SPAM
IP: 188.95.60.–
vitamin+8
Grafoman
26. 5. 2013   #11
-
+1
-
Zajímavé

#10 hlucheucho
Neviem ci to bude efektivnejsie ale podla mna nie. Dynamicka alokacia je pomala a pristup k prvkom pola cez pointre bude tiez pomaly (nemoze byt cely blok dat v cache). 

edit:

Ak aj tak budes chciet kazdy prvok dynamicky alokovat tak mozes pouzit boost::ptr_vector. Lepsie sa s nim pracuje lebo nemusis volat delete.

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
26. 5. 2013   #12
-
0
-

Teď nerozumím. Se postará o odstranění objektu? Jsem z toho zmatený   

hu

Nahlásit jako SPAM
IP: 188.95.60.–
vitamin+8
Grafoman
26. 5. 2013   #13
-
+1
-
Zajímavé

#12 hlucheucho  

struct Trieda{
	Trieda(){std::cout << "Trieda()\n";}
	~Trieda(){std::cout << "~Trieda()\n";}
	void test()const{std::cout << "Trieda::test(): " << this <<"\n";}
};

priklad pri pouziti std::vector:

{
	std::vector<Trieda*> vector;
		
	vector.push_back(new Trieda());
	vector.push_back(new Trieda());
	vector.push_back(new Trieda());
	
	for(auto i = vector.begin(); i != vector.end(); ++i){
		//ak chces zavolat metodu test():
		(*i)->test();
	}
		
		
	//nemozes sa spolahnut na destructor vectoru a prvky musis rucne uvolnovat:
	while(vector.size()){
		delete vector.back();
		vector.pop_back();
	}
}

pomocou boost::ptr_vector:

{
	boost::ptr_vector<Trieda> vector;
	
	vector.push_back(new Trieda());
	vector.push_back(new Trieda());
	vector.push_back(new Trieda());
	
	for(auto i = vector.begin(); i != vector.end(); ++i){
		//ak chces zavolat metodu test():
		i->test();
	}
	
	//destructor ptr_vectoru uvolni pamet
		
}
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
26. 5. 2013   #14
-
0
-

předpokládám, že podobně funguje ptr_dequeue. 

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
26. 5. 2013   #15
-
0
-

Hlavičkové soubory jsem v PC nenašel, nápověda C++ Builderu mlčí. Takže budu muset použít vektor a frontu z STL a destruktory volat sám. Děkuji za pomoc a ukázku jiného řešení.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
KIIV+42
God of flame
26. 5. 2013   #16
-
0
-

#15 hlucheucho
boost se musi doinstalovat... neni defaultne snad nikde

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
26. 5. 2013   #17
-
0
-

#16 KIIV
Ono to vypadá, že nějakou část Embarcadero dodalo, ale není tam to, co potřebuju. Stáhnout 98MB - to tu budu do půlnoci. Balím to - ráno moudřejší večera.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
KIIV+42
God of flame
26. 5. 2013   #18
-
0
-

#17 hlucheucho
pokud se nepletu, tak todle jsou jen ciste sablony... kdyz postahujes vsechny soubory co to potrebuje, tak to bude jen par .hpp

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 96 hostů

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ý