Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.