Portál AbcLinuxu, 10. května 2025 07:29

Dotaz: C++, inicializace pole

16.3.2006 19:30 Michal K.
C++, inicializace pole
Přečteno: 1566×
Odpovědět | Admin
Dobry den.

Potrebuji inicializovat pole v c++ a to touto kontrukci: int pole[]={1,2,3,4,5};

Problem je v tom, ze ono pole je private atribut jedne tridy (o jeho inicializaci se snazim prave v jejim konstruktoru) a g++ mi vyhazuje tuto chybu: expected primary-expression before ']' token

Nevite nekdo co s tim? Potrebuju inicializovat pole takto, ne clen po clenu (pole[0]=0;pole[1]=1,...).

Dekuji.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 16.3.2006 19:38 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C++, inicializace pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
  1. Musíte určit velikost pole.
  2. {...} do konstruktoru asi nenacpete.
Luboš Doležel (Doli) avatar 16.3.2006 19:39 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C++, inicializace pole
Navrhoval bych v konstruktoru udělat třeba tohle:
const int pole[5] = {1,2,3,4,5};
memcpy(m_pole,pole,sizeof(pole));
16.3.2006 20:37 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: C++, inicializace pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
class X {
   int *m_pole;
   int m_size;
public:
   X() {
      static int pole[] = {1, 2, 3, 4, 5};
      m_pole = pole;
      m_size = sizeof pole / sizeof pole[0];
   }
   .
   .
   .
};
Luboš Doležel (Doli) avatar 16.3.2006 20:42 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C++, inicializace pole
Otázka je, jaký smysl má pak m_pole. Když už staticky, tak je čistší udělat tohle:

Header:
class X
{
   static int m_pole[];
};
Cpp:
int X::m_pole[] = { ... };
16.3.2006 20:49 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: C++, inicializace pole
Jo, máte pravdu. Ale mám dojem, že když jsem naposled tohle zkoušel, tak to v (MSVC) nefungovalo a nějak jsem si to zafixoval. Dík za upozornění.
16.3.2006 20:43 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: C++, inicializace pole
Ale pokud má být pole konstantní (dovedu si představit i případ, kdy ne), tak raději
class X {
   const int *m_pole;
   int m_size;
public:
   X() {
      static const int pole[] = {1, 2, 3, 4, 5};
      m_pole = pole;
      m_size = sizeof pole / sizeof pole[0];
   }
   .
   .
   .
};
Luboš Doležel (Doli) avatar 16.3.2006 20:48 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C++, inicializace pole
Tak to je ještě větší hnus. Když už máte konstatní pole, tak je strašně neefektivní kvůli němu zakládat dvě proměnné v teoreticky nekonstatních objektech (instancích třídy X).
16.3.2006 20:51 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Re: C++, inicializace pole
Souhlas, viz výše.
16.3.2006 20:57 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C++, inicializace pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Prvkem třídy nemůže být objekt s proměnnou velikostí. Takže pokud by to pole mělo mít různou velikost pro různé instance třídy, bylo by potřeba ho alokovat dynamicky a vzniká otázka, jak potom udělat konstruktor (může být třeba konstruktor variadická funkce?). Stylově čistší by ale asi bylo místo pole použít std::vector<int>, pak by se nejspíš něco vymyslet dalo.
16.3.2006 21:05 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++, inicializace pole
Prvkem třídy nemůže být objekt s proměnnou velikostí. Takže pokud by to pole mělo mít různou velikost pro různé instance třídy, bylo by potřeba ho alokovat dynamicky ...
Nebo, pokud zname velikost pole v dobe kompilace, stvorit sablonu.
... a vzniká otázka, jak potom udělat konstruktor (může být třeba konstruktor variadická funkce?).
Ano muze.
16.3.2006 21:37 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C++, inicializace pole
Prostě by to chtělo vědět spoustu dodatečných informací - jestli je obsah nebo aspoň velikost toho pole univerzální pro všechny instance, jestli je velikost známa už při kompilaci nebo až za běhu, a k čemu to vlastně má sloužit. Ono je totiž docela dobře možné, že kdybychom tyto informace měli, našlo by se daleko elegantnější řešení založené na něčem úplně jiném.

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.