Probleme mit 'new' bei OOP

Hallo zusammen, hab da ein paar Probleme mit der objektorientierten Programmierung in C++. Es geht um die Verarbeitung von Warteschlangen.

Folgendes ist der Aufbau.

IntQueue.h

#pragma once

class IntQueue
{
public:
 IntQueue(void);
 virtual ~IntQueue(void);
 virtual void add(int) = 0;
 virtual bool old(int& value) = 0;
 virtual int remove() = 0;


};

IntQueueIndexed.h

#pragma once
#include "intqueue.h"

class IntQueueIndexed :
 public IntQueue
{
public:
 IntQueueIndexed(int standard=10);
 ~IntQueueIndexed(void);

 static void add(int add\_int);
 virtual bool old(int& value);
 virtual int remove(int);

private: 
 int \*intZeiger;
 int reserviert;
};

IntQueueIndexed.cpp

#include "IntQueueIndexed.h"

IntQueueIndexed::IntQueueIndexed(int standard)
{
 this-\>intZeiger = new int [standard];
 this-\>reserviert = standard;

}

IntQueueIndexed::~IntQueueIndexed(void)
{

}

void IntQueueIndexed::add(int add\_int)
{



}

int IntQueueIndexed::remove(int)
{
 return 0;
}

bool IntQueueIndexed::old(int &value)
{
 return true;
}

IntQueueIndexed erbt von IntQueue, IntQueue soll Abstrakt sein.
Jetzt zu den Fragen.

  1. Wenn ich in main den Aufruf starte:

    int add_int=2;

    IntQueueIndexed::add(add_int);

Dann sagt er mir, ich würde eine nicht-statische Klasse aufrufen. Deshalb habe ich vor die Methode das „static“ geschrieb. Es funktioniert, die Frage ist, ist das zulässig? Oder gibt es einer andere bessere Lösung?

  1. Ich habe mit intZeiger ja einen Speicherbereich reserviert. Ich kann damit nur (noch) nicht umgehen. Wie greife ich denn in der Methode IntQueueIndexed::add(add_int) darauf zu? Wie komme ich an das Feld ran?

Ich hoffe es ist nicht zu unübersichtlich, und hoffe mir kann jemand helfen. Danke im vorraus.

MFG Philipp

Hallo Philipp,

Dann sagt er mir, ich würde eine nicht-statische Klasse
aufrufen. Deshalb habe ich vor die Methode das „static“
geschrieb. Es funktioniert, die Frage ist, ist das zulässig?
Oder gibt es einer andere bessere Lösung?

„static“ würde ich für diese Klasse nicht verwenden. Am besten wieder entfernen. Benötigt man eher selten.

  1. Ich habe mit intZeiger ja einen Speicherbereich reserviert.
    Ich kann damit nur (noch) nicht umgehen. Wie greife ich denn
    in der Methode IntQueueIndexed::add(add_int) darauf zu? Wie
    komme ich an das Feld ran?

Nee, der Konstruktor deiner Klasse wurde noch nicht aufgerufen. Unten sind drei Möglichkeiten q1,q2,q3 aufgeführt, dies zu tun.
(Falls du einen Debugger hast, kannst Du in den Konstruktor mal einen Breakpoint setzen, um zu sehen, wann er aufgerufen wird.)
Durch das Entfernen von „static“ ist es jetzt auch möglich, in der add-Funktion auf „intZeiger“ zuzugreifen.

Bei remove habe ich ein „int“ hinzugefügt, damit alle Funktionen auch in der abgeleiteten Klasse implementiert werden. Sonst läßt sich keine Instanz anlegen. (Die Funktions-Köpfe müssen immer gleich aussehen)
Beim Konstruktor/Destructor hab ich eine Implementierung hinzugefügt.

Ich denke, die einfachste Möglichkeit ist q2. Falls q2 in mehreren cpp-Dateien verwendet werden soll, einfach in einem Header
„extern IntQueueIndexed q2;“ einfügen und includieren.

Hoffe, dass es Dir weiterhilft.

Viele Grüße
Thorsten

class IntQueue
{
public:
 IntQueue(void){}; // Implementierung fehlte
 virtual ~IntQueue(void){}; // Implementierung fehlte
 virtual void add(int) = 0;
 virtual bool old(int& value) = 0;
 virtual int remove(int) = 0; //int hinzugefügt


};


class IntQueueIndexed :
 public IntQueue
{
public:
 IntQueueIndexed(int standard=10);
 ~IntQueueIndexed(void);

 virtual void add(int add\_int);
 virtual bool old(int& value);
 virtual int remove(int);

private: 
 int \*intZeiger;
 int reserviert;
};


IntQueueIndexed::IntQueueIndexed(int standard)
{
 this-\>intZeiger = new int [standard];
 this-\>reserviert = standard;

}

IntQueueIndexed::~IntQueueIndexed(void)
{

}

void IntQueueIndexed::add(int add\_int)
{



}

int IntQueueIndexed::remove(int)
{
 return 0;
}

bool IntQueueIndexed::old(int &value)
{
 return true;
}


IntQueueIndexed \* q1=0;
IntQueueIndexed q2(42); //als globale Variable, wird bei Programm-Start initializiert

void func(void)
{
 IntQueueIndexed q3(42); //ruft "IntQueueIndexed(int standard)" auf
 q3.add(1);


 q1 = new IntQueueIndexed(42); 
 //ruft "IntQueueIndexed(int standard)" auf
 q1-\>add(1);


 //hier wird q3 wieder gelöscht
}




int main(void)
{
 q2.add(1);

 func(); 

 delete q1; //hier wird ~IntQueueIndexed aufgerufen und q1 gelöscht

 return 0;
}

Entschuldige die späte Antwort. Habe mich da noch etwas mit beschäftigt. Ich danke für deinen komplexen Lösungsanstz. Hat zum Verständniss sehr geholfen. Der Hauptfehler die ich hatte waren folgenden.

Ich hätter, wie bei einer Struktur, eine neue Variable mit den „Datentyp“ der Klasse erschaffen müssen. Ansonsten hätte ich auf die Methoden nicht zugreifen können.

Klingt trivial aber wenn ich das erste mal mit sowas arbeite, kann ich das ja nicht von mir aus wissen denke ich hehe.
Aber dein Beitrag hat mir wiegesagt sehr geholfen, und mich korrekt auf das Problem hingewiesen.