» Poradna » Programy

C++ Dotaz na vektor v hlavičce

 |   | 

Prosím o radu nějakého zkušenějšího programátora v C++. Vytvářím třídu a chtěla bych, aby její součástí byl vektor. Překladač mi to spolkne pouze tehdy, když třídu s vektorem deklaruji v programu (cpp). Ale já bych si přála, aby deklarace této třídy byla v hlavičkovém souboru (h). Překladač mi v tomto případě hlásí syntaktické chyby a error C2501: 'vector' : missing storage-class or type specifiers. V odborné literatuře jsem našla příklady pouze s deklaracemi třídy s vektorem v programu. Je možné nějakým způsobem zabudovat deklaraci třídy s vektorem do hlavičkovém souboru?

Mohlo by vás také zajímat

Odpovědi na otázku

 | 

"#include " musí byť v tých súboroch, kde chcete triedu vector používať. Teda stačí to napísať niekde na začiatok hlavičkového súboru.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Díky za odpověď. S tím #include <vector> jsem to vyzkoušela už dřív, ale nic to nepomohlo. Může být v hlavičkovém souboru #include?Ema

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Skutočne by viac pomohol zdrojový kód (ako píše Swift), ale môžeme sa hrať ďalej na hádanie: možno Vám tam chýba "using namespace std;" (v prípade, že nepoužívate std::vector)?#include v hlavičkovom súbore samozrejme môže byť.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Hlavickove subory su subory ako hocake ine. Nikde nie je napisane co tam moze a nema byt. Dokonca ani nemusia mat priponu .h - Priponu .h maju len preto ze je to tak zauzivane. Tzn. moze tam byt cokolvek - aj #include . K tomu problemu - chyba znamena ze prekladac nepozna dany typ premennej. Jednoducho treba dat na zaciatok toho .h suboru #include .Druha moznost je dat ten isty include pred #include v tvojom .cpp.Dost zle sa to popisuje takto slovne...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Otázka mi připadá poněkud zmatená. 1. Předně bývá zvykem, že deklarace tříd( ostatně čehokoli) je prováděna obvykle v souborech *.h - nikoli tedy v *.CPP ( existují výjimky, ale ty pro tento případ ponechávám mimo ). 2. error C2501 je vstažen k čemu? Z popisu není zřejmé. Čistě ad hoc soudím, že se týká právě řádku v deklaraci třídy kde je deklarován onen vektor. Zřejmě je v tomto řádku použit název něčeho co v danném okamžiku není překladač schopen znát - například typ proměnné.Mnohem efektivnější pro rozbor by bylo místo slovního nejasného popisu problému, prostě onen úsek programu překopírovat a tím ukázat. Odpovídající na dotaz nemívá na živě možnost koukat přes rameno.Odpověď na poslední otázku - Ano, obvykle se to dělá právě tak.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Díky, asi to bude nejlepší na příkladě. Ten můj program je docela složitý, takže jsem napsala jednoduchý příklad s vektorem integerů. fillvector.h obsahuje toto:#include <vector>class Trida { int ix; vector<int> vInt; int poleInt[100];public: Trida(); void fillVector(int i);};fillvector.cpp:#include <string>#include <iostream>#include <fstream>#include <vector>#include "fillvector.h"using namespace std;Trida::Trida() { ix = 0;}void Trida::fillVector(int i) { poleInt[ix] = i; vInt.push_back(i); ix++;}a při překladu se hlásí chyby:Compiling...fillvector.cppd:\céèko\pomoc\ fillvector.h(4) : error C2143: syntax error : missing ';' before '<'d:\céèko\pomoc\fillvector.h(4) : error C2501: 'vector' : missing storage-class or type specifiersd:\céèko\pomoc\fillvector.h(4) : error C2059: syntax error : '<'d:\céèko\pomoc\fillvector.h(4) : error C2238: unexpected token(s) preceding ';'D:\Céèko\pomoc\fillvector.cpp(13) : error C2065: 'vInt' : undeclared identifierD:\Céèko\pomoc\fillvector.cpp(13) : error C2228: left of '.push_back' must have class/struct/union typeError executing cl.exe.fillvector.obj - 6 error(s), 0 warning(s)Asi tam mám nějakou blbost a nevím, co to je. Když odstraním vektor a pracuji s polem, je to dobře.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

fillvector.h neobsahuje "using namespace std;"

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Díky. Opravdu to bylo tím. Zajímavé je, že jsem to už dříve zkoušela na svém dlouhém programu a ten mi po překladu hlásil 102 chyb. Po přeskládání pořadí #include se ale už přeložil i on správně. Ještě jednou děkuji a jsem Vám všem vděčna za to, že jste byli ochotni mi pomoci.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

toto davat do "hacka" je hnusna prasaren!spravne treba deklarovat vInt sko: std::vector vInt;

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

este na doplnenie:using namespace std; je v zdrojakoch - c,cpp uplne v poriadku. v hackach to nema co hladat. ked budes robit na projekte s viacerymi namespaces tak by z toho bol uplny gulas.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

"Hlavickove subory su subory ako hocake ine. Nikde nie je napisane co tam moze a nema byt.""toto (using namespace std) davat do "hacka" je hnusna prasaren!"S tým druhým naprosto súhlasím. Kvííík (nám lenivým prascom je to v hlavičkových súboroch na dve použitia jedno)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

skus tousing namespace std;drbnut trochu skor, napr. pred include fillvector.hInac ja som vector nikdy nepotreboval takze nic ine ma nenapada, vsetko ostatne vyzera byt OK.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

řádek "vector<int> vInt;" bych změnil na "std::vector<int> vInt;""using namespace std;" Uvedený v cpp bych obecně používal velmi, velmi opatrně.Mnohem bezpečnější je místo něj dát si tu práci a psát všude kde je to potřebnéstd::proměnná. Jednak je to čtivější, člověk hned vidí co vlastně opravdu chtěl,jednak se tím vyvaruje výroby chyb které se obtížně hledají.Chybový výpis "d:\céèko\pomoc\ fillvector.h(4) : error C2143: syntax error : missing ';' before '<'"je zdá se ten pán hlavní, ostatní řádky jdou zřejmě na vrub této primární chyby a tonenapsání prostého std::.... v *.h

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

A nesachujes tam nahodou se sablonami bez uvedeni datoveho typu apod.? Jinak bych Ti taky radil sem vlozit aspon radek, kde Ti to hlasi tu chybu a pokud mozno i vetsi kus zdrojaku.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Zdravim,poslite vyrez zdrojaku a ja Vam poslem spravnu deklaraciu. 

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Když vidím kolikrát Ti bylo poraděno napiš tam a tam using namespace std; nedá mi, než Tě ještě jednou před tímto obratem varovat! Tímto řádkem dávám povel překladači aby od této chvíle hledal všechna jména v prostoru std. Právě ve slovíčku všechna se však skrývá poměrně nepříjemné nebezpečí. Použiji-li nějaký název který je současně definován jak v namespace std, tak v namespace global bude rozeznán ten uvedený v namespace std - což může vést na poměrně kuriozní chování programu. using namespace std; je vhodnější nahradit poctivým vypisováním std::.... !!!

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím 

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím 

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím  

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím   

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím    

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Děkuji za radu, provedla jsem to tak, jak mi píšeš. To jsou takové drobné detaily, které neznám, ale jak vidět jsou velmi důležité.Zdravím     

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Vektor, Deklarace, Vector