Dynamisches Array in Main mit -> Operator aufrufen - ****?

Termos

Mitglied
Im folgenden Programm habe ich versucht ein dynamisches Array zu erstellen ...

Der aufruf der Klasse mit dem . Operator ist kein Problem, doch was muss ich ändern um es als Zeiger benutzen zu können ergo einen aufruf via
Code:
d->set(0,ax,0,ay);


Code:
#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;


class zweidim
{
    private: 
        double **d; 
        size_t ax, ay; 
    public: 
        zweidim(int Zeilen=1, int Spalten=1) 
        { 
            ax = Zeilen; 
            ay = Spalten; 
           
			if(ax>0&&ay>0)
			{
				d = new double*[ax];
				for(size_t co=0; co<ax; co++)
				{
						d[co] = new double[ay];
				}

				for(size_t i=0;i<ax;i++)
				{
					for(size_t n=0;n<ay;n++)
					{
						d[i][n]=0.0;					
					}
				}
			}
			else
			{
					cout<<"Falsche Eingabe "<<ax<<","<<ay<<"\n";
					d = NULL;
			}
        } 

       double *& operator[] (size_t ax)  
        { 
			return d[ax]; 
        } 





       /* ~zweidim() 
        { 
			int i;
			for (i = 0; i < ax; i++)
					delete [] d[i];
			delete [] d;
		}*/

	    ~zweidim() {
			if(d != NULL) {
					for(size_t i=0; i < ax; i++)
						if(d[i] != NULL) {
							delete d[i];
							d[i] = NULL;
								}
						delete [] d;
				d = NULL;
						}
		}

		double summe(size_t ax0=0, size_t ax1=0,size_t ay0=0,size_t ay1=0)
		{
			double summe=0;
			size_t temp;
			//Testumgebung für alle Funktionen -> könnten auch als Funktion definiert werden ... 
			//test ob ax/y0 > ax/y1 
			if(ax0>ax1)
			{
				temp=ax0;
				ax0=ax1;
				ax1=temp;
			}

			if(ay0>ay1)
			{
				temp=ay0;
				ay0=ay1;
				ay1=temp;
			}
			//test ende

			//Testen ob ay1|ax1 > this->ax/ay 
			if(ax1>=this->ax)
			{
				ax1=(this->ax)-1;	//Klammern dienen nur der optik
			}
			if(ay1>=this->ay)
			{
				ay1=(this->ay)-1;
			}
			//Testumgebung ende

						
			for(size_t i=ax0;i<=ax1;i++)
				{
					for(size_t n=ay0;n<=ay1;n++)
					{
						summe=summe+d[i][n];
					}
				}
			
			return summe;
		}

				
		

		
		//Rückgabe von ax
		size_t get_ax()
		{
			return this->ax;				//Rückgabe der Member variable
		}
		//Rückgabe von ay
		size_t get_ay()					
		{
			return this->ay;				//Rückgabe der Member variable
		}
		//Wert an Position x,y setzen
		void set(size_t ax=0, size_t ay=0, double wert=0.0)
		{
			if(d!=NULL && ax<this->ax && ay<this->ay)			//Prüfuen ob d existent / vergleich ob ax < als Member ax (ay) 
			{
				d[ax][ay]=wert;
			}
			else
			{
				cout<<"Wert konnte nicht gesetzte werden, objekt nicht existent oder Position oberhalb des Arrays\n";
			}

		}

		//Wert holen // Anzeigen
		double get(size_t ax=0, size_t ay=0)
		{
			if(ax>this->ax || ay>this->ay)
			{
				cout<<"Unzulässige Werte x y \n";
				return 0;
			}else
			{
				
			return  d[ax][ay];
			}
		}

		//Anzeigen Aller Elemente 
		void show(size_t ax0=0, size_t ax1=0, size_t ay0=0, size_t ay1=0)
		{
			//Testumgebung für alle Funktionen -> könnten auch als Funktion definiert werden ... 
			//test ob ax/y0 > ax/y1 
			int temp;
			if(ax0>ax1)
			{
				temp=ax0;
				ax0=ax1;
				ax1=temp;
			}

			if(ay0>ay1)
			{
				temp=ay0;
				ay0=ay1;
				ay1=temp;
			}
			//test ende

			//Testen ob ay1|ax1 > this->ax/ay 
			if(ax1>=this->ax)
			{
				ax1=(this->ax)-1;	//Klammern dienen nur der optik
			}
			if(ay1>=this->ay)
			{
				ay1=(this->ay)-1;
			}
			//Testumgebung ende
			
			//Ausgabe Schleife
			for(size_t i=ax0;i<=ax1;i++)
				{
					for(size_t n=ay0;n<=ay1;n++)
					{
						cout<<d[i][n]<<"\t";
					}
					cout<<"\n";
				}
		}//Ende Show

		void ein(size_t ax0=0, size_t ax1=0, size_t ay0=0, size_t ay1=0)
		{
			int wert=0;
			
			//Testumgebung für alle Funktionen -> könnten auch als Funktion definiert werden ... 
			//test ob ax/y0 > ax/y1 
			int temp;
			if(ax0>ax1)
			{
				temp=ax0;
				ax0=ax1;
				ax1=temp;
			}

			if(ay0>ay1)
			{
				temp=ay0;
				ay0=ay1;
				ay1=temp;
			}
			//test ende

			//Testen ob ay1|ax1 > this->ax/ay 
			if(ax1>=this->ax)
			{
				ax1=(this->ax)-1;	//Klammern dienen nur der optik
			}
			if(ay1>=this->ay)
			{
				ay1=(this->ay)-1;
			}
			//Testumgebung ende


				for(size_t i = ax0;i <=ax1;i++)					//-1 da die werte von ax0 mit 1 kommen [Index0 beachten]
					{
						for(size_t n = ay0;n<=ay1;n++)			//-1 da die werte von ax0 mit 1 kommen [Index0 beachten]
						{
							cout<<"Eingabe ["<<i<<"],["<<n<<"] = ";

							do {
								cin>>wert;
								if(cin.eof()) break;
								if(cin.fail() || (cin.peek() != '\n')){
									cout<<"Falsch, erneut eingeben: ";
									cin.clear(); cin.ignore(INT_MAX,'\n');
									continue;
								}
									break;
							} while(true);
							d[i][n]=wert;
							cout<<"\n";
						}
						cout<<"\n";
					}
		}
};


int main()
{
	int ax,ay;
	cout<<"Zeilen Anzahl: ";
	cin>>ax;
	cout<<"Spalten Anzahl: ";
	cin>>ay;
	zweidim d(ax,ay);
	d.set(ax-1,ay-1,100);
	cout<<"Element ["<<ax<<"]["<<ay<<"] = "<<d.get(ax-1,ay-1)<<"\n";
	d.show(0,ax,0,100);
	d.ein(0,ax,0,ay);
	d.show(0,ax,0,ay);
	cout<<"gesamtsumme = "<<d.summe(1,ax,1,ay)<<"\n";


	system("PAUSE");
	return 0;
}
 
Im folgenden Programm habe ich versucht ein dynamisches Array zu erstellen ...

Der aufruf der Klasse mit dem . Operator ist kein Problem, doch was muss ich ändern um es als Zeiger benutzen zu können ergo einen aufruf via
Code:
d->set(0,ax,0,ay);
Um es als Zeiger benutzen zu können muss es ein Zeiger sein. :eek:

Was ist denn der Sinn deiner Frage?

C++:
zweidim* pd = &d;

pd->set(...);
Gruß
 
Hi

C++:
zweidim d(ax,ay);
änderst du zu
C++:
zweidim *d = new zweidim(ax,ay);

Und am Schluss (vor return) kommt noch ein
C++:
delete d;
rein.

Dass du die . in-> ändern musst (oder (*d). ) weißt du ja.

Gruß

Ergänzung: deepthroats Variante verwendet eine zweite Variable als Pointer auf die Normale.
new/delete entfallen deswegen, weil die eigentliche Variable ja die Normale ist
und das dort schon vom Compiler übernommen wird.
Der Pointer ist dabei nur eine Art Alias.
 
Zuletzt bearbeitet:
Zurück