Portál AbcLinuxu, 30. září 2026 02:51


Dotaz: C++, inicializace pole

16.3.2006 19:30 Michal K.
C++, inicializace pole
Přečteno: 1802×
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: 71 | 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: 71 | 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ákno • Nahoru

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

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