Forum: PC-Programmierung C++: Klasse nicht richtig initialisiert?


von michael (Gast)


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.

von yalu (Gast)


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.

von michael (Gast)


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....

von Chris (Gast)


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.

von michael (Gast)


Lesenswert?

wie kann ich denn sonst noch eine Variable mit übergeben?
wenn ich "&ProcessVideo(NULL, m_pTracker)" schreibe, dann kommt der 
fehler "'&' erwartet L-Wert".

von michael (Gast)


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....

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.