
c++ virtualne funkcie
Zdravim.
Nevie mi niekto povedat ci sa daju definovat virtualne funkcie aj mimo hlavickoveho suboru? Potrebujem oddelenu deklaraciu od definicie. Napr. takto:
test.hpp
class test
{
virtual public bool isTest();
}
test.cpp
#include "test.hpp"
bool test::isTest()
{
...
}
Ja myslim ze nie ptz ked z nej budes odvodzovat inu triedu tak includujes len .hpp, a ked ju neoverridnes tak odkial ma compiler/linker vediet ze co tam ma byt povodne?
Ale nic ti nebrani to vyskusat (podla mna to bude pokus neuspesny). ja som to nikdy neskusal.
No dobre a ked budem chciet skryt kod vykonavany tou virtualnou funkciou a ponechat len deklaraciu, tak ako nato? Ci to nie je mozne? Alebo si urobit dalsiu non-virtual funkciu a tu volat v tej virtualnej?
A pred kym chces skryt ten kod, pred kompilerom?
Predtym, kto by ho chcel kopirovat a vytvarat nesystemove riesenie duplikovanim uz raz napisaneho kodu.
Ale inak dobra poznamka, aj pred kompilerom by nebolo od veci ho skryt.
ono ked tak nad tym rozmyslam tak stejne musi mat kazdy kto bude chciet pouzit tu triedu vo svojom projekte aj cele to tvoje cpp, takze stejne musi mat vsetky zdrojaky. Jedine ak by si dodaval nejake .lib tak by nemusel mat tvoje .cpp
Mozes skusit aj to co si navrhoval ze presunut to uplne do .cpp, mozno to ide.
No nemusi vidiet cele moje cpp, staci mu bohato h, alebo hpp, staticka libka, ktoru si linker nalinkuje priamo do exe, alebo dynamicku kniznicu, je to len vec realizacie ako sa to urobi. A inak pokial dobre viem tak linker s cpp, a ani hpp tusim az tak moc nepracuje, pracuje s objektovymi subormi .o a podla symbolov vklada casti kodu do prislusneho exe, alebo kniznice. V objekt pascale toto funguje bez problemov, tam ani nie su ziadne hlavickove subory ale c/c++ sa mi zda efektivnejsie, no nepaci sa mi cast kodu v tom hpp subore, to by som tam moc nechcel.
Inak skusal som to a na jednej triede mi ta kompilacia presla bez problemov a tu dalsiu nemozem skompilovat takze to zrejme bude len chyba mojej nepozornosti, alebo robim nieco zle.
Ano s .lib je mozne tu triedu potom pouzivat aj bez cpp, som to aj pisal.
Ja neviem co robis zle kedze si sem nenapisal ze jaku chybu ti pise compiler alebo linker alebo kto
Vypisuje mi to takuto chybu:
Vypisuje to linker. To co som googlil som nasiel v jednom odkaze ze by virtualne metody mali byt v hlavickovych suboroch, alebo som to zle prelozil.
A dal si linkeru aj to lib? Alebo mas v projekte teraz to .cpp so zdrojakmi? Ktora metoda je virtualna? Linker nenasiel metody ACGroupState a ACStateController
P.S> sorry metody ktore nenasiel su az na konci toto su triedy v ktorych to nenasiel. Nenasiel tam tych metod vela (viz chybove hlasky na konci kazdej je nazov metody), takze zrejme si linkeru nedal to lib ani cpp
Linker nenasiel ani jednu z tychto:
ACGroupState::checking
ACStateController::getData
ACStateController::freeLastDataItem
ACStateController::isData
ACStateController::run
ACStateController::getData
ACStateController::freeLastDataItem
ACStateController::isData
ACStateController::run
P.S.2. ak to nie su tvoje metody tak si do nastaveni linkeru nepridal nejaku kniznicu ktoru pouzivas.
Nemam momentalne lib, zatial je to len vo vyvoji tak pouzivam priamo cpp subory, viem ze je ich viac a su to moje triedy ziadna ina lib. Posielam priklad na jednoduchsej triede, na tej to budem riesit tie ostatne su moc komplikovane nechce sa mi to cele rozpisovat. Vyzera asi takto:
Samozrejme je nedopisana, nema zatial zmysel pokracovat. Ten public je tam dva krat lebo ten prvy krat to bolo private. Ma to byt sablonova trieda, a ked to skompilujem ako sablonu tak v tedy mi nenajde referenciu na checkState(). Ked ale template zakomentujem tak ako je to teraz, v pohode ju skompilujem a aj program zbehne bez problemov ziadna chyba. Ked ale template vsade odkomentujem tak dostanem toto:
Je na tom nieco zle?
Mozna ze to je preto lebo double neni class, skus tam dat namiesto class slovo typename, podobne jak tuto
http://www.codersource.net/C/CTutorialonTemplates/ CClassTemplates.aspx
Ja som teplates nikdy nepouzil takze v templaes ti viac asi neporadim :)