Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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()
{
...
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ja myslim ze nie ptz ked z nej budes odvodzovat inu triedu tak includujes len .hpp, a ked ju neoverr…
MM.. 15.06.2012 16:35
MM..
No dobre a ked budem chciet skryt kod vykonavany tou virtualnou funkciou a ponechat len deklaraciu,…
PedroB 15.06.2012 16:44
PedroB
A pred kym chces skryt ten kod, pred kompilerom?
MM.. 15.06.2012 16:48
MM..
Predtym, kto by ho chcel kopirovat a vytvarat nesystemove riesenie duplikovanim uz raz napisaneho ko…
PedroB 15.06.2012 16:54
PedroB
ono ked tak nad tym rozmyslam tak stejne musi mat kazdy kto bude chciet pouzit tu triedu vo svojom p…
MM.. 15.06.2012 17:03
MM..
No nemusi vidiet cele moje cpp, staci mu bohato h, alebo hpp, staticka libka, ktoru si linker nalink…
PerdoB 16.06.2012 22:02
PerdoB
Ano s .lib je mozne tu triedu potom pouzivat aj bez cpp, som to aj pisal. Ja neviem co robis zle ked…
MM.. 16.06.2012 22:14
MM..
Vypisuje mi to takuto chybu: /home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_…
PerdoB 16.06.2012 22:52
PerdoB
A dal si linkeru aj to lib? Alebo mas v projekte teraz to .cpp so zdrojakmi? Ktora metoda je virtual…
MM.. 16.06.2012 22:55
MM..
Nemam momentalne lib, zatial je to len vo vyvoji tak pouzivam priamo cpp subory, viem ze je ich viac…
PerdoB 17.06.2012 00:07
PerdoB
Mozna ze to je preto lebo double neni class, skus tam dat namiesto class slovo typename, podobne jak… poslední
MM.. 17.06.2012 23:40
MM..

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.

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.

Vypisuje mi to takuto chybu:

/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/reporty/CReporting.cpp:4071: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopState.o:(.rodata._ZTV10CStopState[vtable for CStopState]+0x10): undefined reference to `ACGroupState<Json::Value, CCVJson>::checking(ACBaseState<Json::Value, CCVJson>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopState.o:(.rodata._ZTV12ACGroupStateIN4Json5ValueE7CCVJsonE[vtable for ACGroupState<Json::Value, CCVJson>]+0x10): undefined reference to `ACGroupState<Json::Value, CCVJson>::checking(ACBaseState<Json::Value, CCVJson>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV15CStopController[vtable for CStopController]+0x10): undefined reference to `ACStateController<Json::Value, CCVJson>::getData(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV15CStopController[vtable for CStopController]+0x18): undefined reference to `ACStateController<Json::Value, CCVJson>::freeLastDataItem(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV15CStopController[vtable for CStopController]+0x20): undefined reference to `ACStateController<Json::Value, CCVJson>::isData(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV15CStopController[vtable for CStopController]+0x28): undefined reference to `ACStateController<Json::Value, CCVJson>::run(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV17ACStateControllerIN4Json5ValueE7CCVJsonE[vtable for ACStateController<Json::Value, CCVJson>]+0x10): undefined reference to `ACStateController<Json::Value, CCVJson>::getData(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV17ACStateControllerIN4Json5ValueE7CCVJsonE[vtable for ACStateController<Json::Value, CCVJson>]+0x18): undefined reference to `ACStateController<Json::Value, CCVJson>::freeLastDataItem(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV17ACStateControllerIN4Json5ValueE7CCVJsonE[vtable for ACStateController<Json::Value, CCVJson>]+0x20): undefined reference to `ACStateController<Json::Value, CCVJson>::isData(IDataIterator<Json::Value>&)'
build/Debug/GNU-Linux-x86/BaseStopSystem/CStopController.o:(.rodata._ZTV17ACStateControllerIN4Json5ValueE7CCVJsonE[vtable for ACStateController<Json::Value, CCVJson>]+0x28): undefined reference to `ACStateController<Json::Value, CCVJson>::run(IDataIterator<Json::Value>&)'

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:

ACGroupState.hpp

#ifndef ACGROUPSTATE_HPP
#define	ACGROUPSTATE_HPP
#include <list>

//template<class valueType, class valueAccessor>
class ACGroupState  
{
    public:
        bool checkStates();
        
    public:
        ACGroupState(){};
};

#endif	/* ACGROUPSTATE_HPP */

ACGroupState.cpp
#include "ACGroupState.hpp"

//template<class valueType, class valueAccessor>
bool ACGroupState/*<valueType, valueAccessor>*/::checkStates()
{
}

main.cpp

#include <cstdlib>
#include "../reporty/stateReports/ACGroupState.hpp"
#include "../../worker_new/includes/JSONcpp/json/json.h"
using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    ACGroupState/*<double, double>*/ test;
    test.checkStates();
    return 0;
}


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:

Copying project files to /home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/ at kardos@192.168.137.150:22
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/NewReports'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/newreports
make[2]: Entering directory `/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/NewReports'
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
g++    -c -g -I../../worker_new/includes/JSONcpp -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp
make[2]: Warning: File `../reporty/stateReports/ACGroupState.cpp' has modification time 3.4e+06 s in the future
mkdir -p build/Debug/GNU-Linux-x86/_ext/379575527
rm -f build/Debug/GNU-Linux-x86/_ext/379575527/ACGroupState.o.d
g++    -c -g -I../../worker_new/includes/JSONcpp -MMD -MP -MF build/Debug/GNU-Linux-x86/_ext/379575527/ACGroupState.o.d -o build/Debug/GNU-Linux-x86/_ext/379575527/ACGroupState.o ../reporty/stateReports/ACGroupState.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/newreports build/Debug/GNU-Linux-x86/_ext/663172118/json_reader.o build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/_ext/379575527/ACGroupState.o build/Debug/GNU-Linux-x86/_ext/663172118/json_writer.o build/Debug/GNU-Linux-x86/_ext/663172118/json_value.o  
build/Debug/GNU-Linux-x86/main.o: In function `main':
/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/NewReports/main.cpp:22: undefined reference to `ACGroupState<double, double>::checkStates()'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/newreports] Error 1
make[2]: Leaving directory `/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/NewReports'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/kardos/.netbeans/remote/192.168.137.150/test-server-Windows-x86_64/F/temp_projects/reporty/NewReports'
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2, total time: 6s)

Je na tom nieco zle?

Zpět do poradny Odpovědět na původní otázku Nahoru