Zum Inhalt springen

[C++] Dynamisches (2D) Array bei Instanziierung eines Objekts


Unrest

Empfohlene Beiträge

Guten Morgen zusammen,

ich habe zur Übung meiner brachliegenden C-Fähigkeiten ein "Game of Life" für die Konsole geschrieben.

In C funktionierte das problemlos und gut, jedoch macht mir das Umschreiben nach C++, bzw. nach OOP, Probleme.

Und zwar benötige ich zwei Objekte namens "grid" und "future_grid", welche jeweils ein gleich großes 2dimensionales Array beinhalten und diverse Methoden.

Die Größe des/-r Arrays ist vom Benutzer festzulegen, was dynamische Speicherverwaltung nötig macht.

Mein Ansatz war im private Bereich "int** grid" zu deklarieren, im Konstruktor dann mittels "grid = new int*[height]" und in ner for{} dann jedem Element von grid ein "new int [width]" hinzufügen.

Ziel war es dabei das Feld dann mit stinknormaler Array-Syntax anzusprechen.

Dieses Vorgehen funktioniert prinzipiell auch, bspw. in main(), jedoch nicht im Objekt selbst.

Da ich in C++ nicht all zu bewandert bin, steh ich nun auf dem Schlauch.. :(

Wie kann ich bei der Instanziierung eines Objekts ein zweidimensionales Array auf dem Heap anlegen?

Gruß,

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Stück Code aus meiner Template-Vektor Klasse:


template <typename T> class Vector {

	private:

		T* maElements;

		const unsigned int mnDimension;


	template <typename T> Vector<T>::Vector( const unsigned int& pnDim ) :

		mnDimension		(pnDim)

	{

		maElements = new T[mnDimension];

		std::memset(maElements, 0, mnDimension*sizeof(T));

	}


	template <typename T> Vector<T>::Vector( const Vector<T>& poVector ) :

		mnDimension		(poVector.mnDimension)

	{

		maElements = new T[mnDimension];

		std::memcpy(maElements, poVector.maElements, mnDimension*sizeof(T));

	}


	template <typename T> Vector<T>::~Vector( void ) {

		if (maElements)

			delete[] maElements;

	}

};

HTH Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie kann ich bei der Instanziierung eines Objekts ein zweidimensionales Array auf dem Heap anlegen?
In einem Schritt gar nicht. Brauchst du aber auch nicht. Ist dir bewusst, dass es in der Standardbibliothek bereits eine vector-Klasse gibt? Warum nicht einfach ein std::vector<std::vector<T> > ?

Wenn du das unbedingt selbst implementieren willst, solltest du aber keinesfalls memset und memcpy verwenden. Je nach Template-Typ geht das mächtig in die Hose. Das funktioniert nämlich nur für POD-Typen. Bei Klassen wie z.B. std::string wird dir das um die Ohren fliegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du das unbedingt selbst implementieren willst, solltest du aber keinesfalls memset und memcpy verwenden. Je nach Template-Typ geht das mächtig in die Hose. Das funktioniert nämlich nur für POD-Typen. Bei Klassen wie z.B. std::string wird dir das um die Ohren fliegen.

Okay hätte ich dazu schreiben müssen. Für 3D Graphik, wo es sich hier nur um einfache numerische Datentypen handelt, kann man Memset durchaus verwenden. Ansonsten geb ich da Klotzkopp recht.

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...