Rychlá inicializace pole v konstruktoru - jak? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rychlá inicializace pole v konstruktoru - jak? – C / C++ – Fórum – Programujte.comRychlá inicializace pole v konstruktoru - jak? – C / C++ – Fórum – Programujte.com

 

Huge0
Návštěvník
20. 6. 2007   #1
-
0
-

Můj problém je následující:
V třídě je pole, to chci inicializovat ještě před složenou závorkou konstruktoru. Asi takto:

class priklad{

private: float pole[3]; // Toto pole budu chtít inicializovat konstruktorem.
public: priklad();
};
priklad::priklad():
// Následuje dosud neřešitelný problém, jak iniciovat pole ještě před tělem konstruktoru:
pole(1.0, 1.2, 1.0) // Takto ne.
pole({1.0, 1.2, 1.0}) // Ani takhle...
pole{1.0, 1.2, 1.0} // Takhle už vůbec.
{/*Tady už by to snad mělo jít...*/}


Takže jak? Díky za odpověď.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
20. 6. 2007   #2
-
0
-

Podle mého názoru se ti taková konstrukce nepovede, ale můžu se mýlit. Jen tak, mimochodem, k čemu takovou šílenost vůbec potřebuješ(pokud to není tajemství)?

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
21. 6. 2007   #3
-
0
-

To Jura: Plně s tebou souhlasím navíc se mi to zdá jako úplná zbytečnos.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
21. 6. 2007   #4
-
0
-

To Matrix17:
Zbytečnost to určitě není, pokud nemyslíš zrovna tento konkrétní případ, takto inicializovat proměnné je ten nejvhodnější způsob, protože pokud by členské proměnné byly třídami, tak je zbytečné, aby se na ně sahalo 2x - jednou při vytvoření( pomocí bezparam.konstruktoru), tedy v inicializačním seznamu a podruhé v těle konstruktoru pomocí operátoru přířazení(samozřejmě za podnmínky,že ktomu mají potřebný konstruktor). Navíc například takové KOSTANTNÍ členské proměnné ani jinde než v inicializační časti inicializovat nejdou. Takže jedno řešení by bylo nachystat si to pole do vectoru a ten předat jako parametr konstruktoru, kterým by se inicializovakl vector ve třídě priklad, nebo si udělat nějakou třídu, která by vracela referenci na ten objekt a dokazala ho naplnit - příliiš pracné. Navíc tady to zcela postrádá smysl - zde je to pole statické, takže se akorát vyalokuje na zásobníku potřebné místo(opravte mě pokud se mýlím, nechce se mi to teď hledat). Raději ať Huge napíš k čemu to potřebuje - určitě to půjde vyřešit lépe(víc hlav, víc ví).

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
21. 6. 2007   #5
-
0
-

To Jura: Já opravdu myslel jen tenhle konkrétní příklad.

Nahlásit jako SPAM
IP: ...–
Huge0
Návštěvník
22. 6. 2007   #6
-
0
-

Jde prostě o pole s pevně daným počtem prvků (tak mi přijde vektor trochu zbytečnej), který určuje souřadnici bodu, od kterého začínám cykly (kým čím) vykreslovat objekty v OGL.
Takže je pravda, že typy, které jsou klíčovými slovy v C++ (jednoduché) nejsou při vytvoření inicializované? Pak by zřejmě bylo stejně efektivní inicializizovat pole v těle jako v inicializačním segmentě.
Ale jak bych to teda řešil, kdybych měl v jedné třídě pole jiných tříd? Např. takto:



class zlomek{
private:
int jmenovatel, citatel;
public:
zlomek();
};

zlomek::zlomek():
citatel(0), jmenovatel(1){};

class slozeny_zlomek{
private:
// V takovémto kódu by asi byly i lepší způsoby uchování dat, ale toto je jen pro příklad:
zlomek dvojity_zlomek[2];
public:
slozeny_zlomek();
};

slozeny_zlomek::slozeny_zlomek():
// Inicializují se oba prvky pole pomocí zlomek::zlomek() nebo je máme inicializovat, příp. jak??
{};


A druhá věc, která by mě zajímala je, jestli neexistuje nějaká snažší inicializace pole jednoduchých typů ve třídě, než cyklem.
booltrida::booltrida():

bool1(true),
boolpole(NULLS /*nebo co já vím, jak by to vypadalo...*/, 64 /*počet prvků*/)
// ...
Vím, že bych na to moh napsat makro nebo funkci, ale pokud by byl v C++ i nějaký předdefinovaný způsob, tak to bude asi vhodnější. Tak doufám, že neotravuju moc, a díky za po-moc.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
22. 6. 2007   #7
-
0
-

Rozhodně neotravuješ od toho tu fóra jsou.

>>Takže je pravda, že typy, které jsou klíčovými slovy v C++ (jednoduché) nejsou při vytvoření inicializované?

Ne tak docela. Všechny členy třídy jsou vytvořeny, ještě před tělem konstruktoru, tedy v inicializační části(a je jedno jestli to jsou nebo nejsou primitivní datové typy).

>>Pak by zřejmě bylo stejně efektivní inicializizovat pole v těle jako v inicializačním segmentě.

Taková konstrukce pokud je to pole nejde(max. ji zde můžes ALOKOVAT - vytvořit). Znova opakuju, že zde se členy vytvářeji - pokud je to objekty zavolá se konstruktor, díky němuž si můžes členy těch tříd inicilazovat na nějakou hodnotu - to je vlastnost konstuktorů, stejně tak se dájí inicializovat i primitivní typy(zápis int num = 5 je ekvivalentní se zápisem int num(5)) .

>> Ale jak bych to teda řešil, kdybych měl v jedné třídě pole jiných tříd?

Jak jsem psal kdesi výše, jedině přes specialní třídu. Kromě toho ten tvůj příklad je vpořádku - při vytvoření třídy slozeny_zlomek se vytvoří napřed členy této třídy, takže dojde automaticky(protože je to pole statické) k zavolání konstuktoru třídy zlomek, ve kterém oba členy inicializuješ na příslušnou hodnotu.

>> A druhá věc, která by mě zajímala je, jestli neexistuje nějaká snažší inicializace pole jednoduchých typů ve třídě, než cyklem.
Tohle uděláš maximálně v těle konstruktoru a můžeš k tomu použít třeba funkci memset - pokud maji mit prvky pole stejnou hodnotu(ale pozor,hodnota seprekonvertuje na unsigned char viz. http://www.cplusplus.com/reference/clibrary/cstring/memset.html ).





Nahlásit jako SPAM
IP: ...–
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, 21 hostů

Moderátoři diskuze

 

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