C++: Klasse nicht richtig initialisiert?

Gast #659942
Lesenswert?

hallo zusammen,

ich arbeite mit ms visual studio 2005. dort habe ich eine klasse 
geschrieben die so aussieht:

class CTest
{
public:
   CTest(void);
   ~CTest(void);

   void test();

   int select;
}

der konstruktor hat nur die initialisierung von select = 0 drin.
in meinem hauptprogramm habe ich einen pointer auf die klasse angelegt. 
im konstruktor des hautprogrammes "erstelle" ich dann die variable mit:
m_ptest = new CTest;

soweit so (hoffentlich) gut. wenn ich jetzt in meinem hauptprogramm mit 
m_ptest->test() die funktion aufrufe, dann klappt das auch. aber sobald 
ich versuche die variable select zu benutzen (sei es schreiben oder 
lesen), dann bekomme ich einen speicherzugriffsfehler. beim debuggen ist 
mir aufgefallen, dass im konstruktor von CTest die variable 
ordnungsgemäß auf 0 gesetzt wird. in der funktion steht aber nur noch 
müll drin.

wahrscheinlich ist das wieder so ein kleiner anfängerfehler, aber ich 
weiß echt nicht weiter.
Gast #659970
Lesenswert?

Diese Informationen sind etwas vage, um konkret zu sagen zu können
wo's hapert. Du must etwas mehr Code posten, am besten ein
vollständiges Miniprogramm, das die Klasse, das Hauptprogramm, die
Methodenaufrufe und die Membervariablenzugriffe enthält.
Gast #660021
Lesenswert?

header:

class CTracker
{
public:
  CTracker(void);
  ~CTracker(void);

  void Invoke_Tracker(IplImage* image);


  int select;

};

cpp:

CTracker::CTracker(void)
{
  select = 0;
}

void CTracker::Invoke_Tracker(IplImage* image)
{
  if(select == 0) Background(image);
  if(select == 1) DiffBackground(image);
}

___________________________________________________________________
"hauptprogramm"
cpp:

typedef void (*TMyFunction) ( IplImage*, CTracker*);

// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"

void ProcessVideo(IplImage* image, CTracker* tracker)
{
  IplImage* image1 = reinterpret_cast<IplImage*>(image);
  if(image1 != NULL) tracker->Invoke_Tracker(image1);
}

CtrackingDlg::CtrackingDlg(CWnd* pParent /*=NULL*/)
{
  ...
  m_pTracker = new CTracker();
}

void CtrackingDlg::OnBnClickedButtonStart()
{
  ...

  void * ptr = static_cast<void*>(&ProcessVideo);
  (static_cast<TMyFunction>(ptr))(NULL, m_pTracker);

        ...
  cvcamSetProperty(0, CVCAM_PROP_CALLBACK, ptr);
  ...
}

hier wird eine callbackmethode in opencv gesetzt, die dann das frame zur 
verarbeitung weiterreicht. funktioniert auch. bis auf den zugriff auf 
die variablen. ich würde vermuten, dass der typedef da was verhaut... 
nur funktioniert der rest....
Gast #660335
Lesenswert?

> void * ptr = static_cast<void*>(&ProcessVideo);

Das ist nicht erlaubt. Denn &ProcessVideo ist ein Funktionszeiger, void* 
aber ein Datenzeiger. Du darfst jeden Datenzeiger nach void* casten, 
Funktionszeiger aber niemals.
Gast #660587
Lesenswert?

hab gerade nen weg gefunden. ist zwar noch nicht optimal, aber 
funktioniert.
anstatt die m_pTracker zu übergeben, habe ich sie global definiert und 
kann so auch ausserhalb der klasse (also in ProcessVideo) darauf 
zugreifen....
Gast #661299
Lesenswert?

> CTracker::CTracker(void)
> {
>   select = 0;
> }

Stilistisch besser wäre:

CTracker::CTracker(void)
    : select(0)
{
}

> void ProcessVideo(IplImage* image, CTracker* tracker)
> {
>  IplImage* image1 = reinterpret_cast<IplImage*>(image);

Wozu glaubst du, den reinterpret_cast zu benötigen?

>  void * ptr = static_cast<void*>(&ProcessVideo);
>  (static_cast<TMyFunction>(ptr))(NULL, m_pTracker);

Hier nochmal ein nutzloser (und in diesem Fall eben falscher) Cast.

> bis auf den zugriff auf die variablen. ich würde vermuten, dass der
> typedef da was verhaut... nur funktioniert der rest....

Ich denke, daß du erstmal die ganze Casterei abstellen solltest.

> wie kann ich denn sonst noch eine Variable mit übergeben?

Wem willst du wo was für eine Variable übergeben?

> wenn ich "&ProcessVideo(NULL, m_pTracker)" schreibe, dann kommt der
> fehler "'&' erwartet L-Wert".

ProcessVideo(NULL, m_pTracker) wäre ja auch ein Aufruf der Funktion. Das 
& würde in dem Fall die Adresse des Rückgabewertes der Funktion bilden, 
aber die Funktion gibt nichts zurück, von dem man die Adresse bilden 
kann.
Ich habe keine Ahnung, was du eigentlich erreichen willst.

PS: Deine Shift-Taste scheint kaputt zu sein. Zumindest kommen von dir 
außer im Quellcode die Großbuchstaben nicht an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren