PDA

View Full Version : [C++] Interfacce


Bonfo
23-09-2006, 19:18
Odio ammetterlo, ma con C++ sono proprio una schiappa!!! :muro:

Eccola domanda: come si fa una interfaccia??
Io sono partito con questo (sto lavorando con OpenCV):

#include "cv.h"

class CVOperator
{
public:
virtual IplImage* Apply(IplImage* image);
};


questo è file CVOperator.h senza che esista un CVOperator.cpp

A ruota ho poi realizzato questa classe

#include "CVOperator.h"

#include "cv.h"

class GreyScale: CVOperator
{
public:
GreyScale();
virtual ~GreyScale();

IplImage* Apply(IplImage* image);
};

e questo è il file GreyScale.h ed esiste il file GreyScale.cpp con il codice

Infine ho realizzato questo:

CVImage* CVImage::Apply(CVOperator* cvOperator)
{
return new CVImage(cvOperator->Apply(m_image));
}

nel codice della classe CVImage.

Bene...compilazione Ok :sofico:
Linking :

./src/GreyScale.o(.text$_ZN10CVOperatorC2Ev[CVOperator::CVOperator()]+0x8): In function `ZN20wxThreadHelperThreadD0Ev':
D:/Valerio/workspace/CVLab/Debug/../src/GreyScale.cpp: undefined reference to `vtable for CVOperator'

:cry: :cry: :muro: :muro:

:help: :help: :help:

P.S.: Lo sembra che sembra complesso, ma è per tenere il membro IplImage di CVImage sempre privato e senza un getter ;)

71104
23-09-2006, 21:28
la classe CVOperator dovrebbe essere l'interfaccia? se è così allora l'errore sta nel fatto che un'interfaccia deve contenere solo metodi "pure virtual", ovvero metodi dichiarati con virtual e con "= 0" alla fine; e ovviamente senza implementazione.

in altre parole devi fare un piccolo cambiamento, dopodichè dovrebbe andare:

#include "cv.h"

class CVOperator
{
public:
virtual IplImage* Apply(IplImage* image) = 0;
};

Bonfo
24-09-2006, 03:46
Ottimo!!! Problema risolto. :winner:

Ora però ce ne è un altro !!! :muro: :muro:

error: `CVOperator' is an inaccessible base of `GreyScale'


ed ecco il codice che ha generato l'errore:


GreyScale* greyScale = new GreyScale();
CVImage* greyLevelImage = cvImage->Apply(greyScale);


...e adesso che ha che non va?? :cry:

Bonfo
24-09-2006, 12:37
Ma porcaccia!!! :doh:

Mi ero scordato il public nella dichiarazione dell'ereditarietà. :D :D



#include "CVOperator.h"

#include "cv.h"

class GreyScale: public CVOperator
{
public:
GreyScale();
virtual ~GreyScale();

IplImage* Apply(IplImage* image);
};

71104
24-09-2006, 18:18
risolto tutto? mi fa piacere, così non hai scuse aggiuntive per tornare a lavorare su DC :D :D :D