Class Matrix (Array füllen****)

Seyphedias

Grünschnabel
Hallo leute,

ich habe folgendes Problem:

ich möchte einen Konstruktor schreiben meiner klasse "matrix", dem ich lediglich die Dimension gebe.
soweit so gut..

eine Matrix ist ja ein Array, also bspw: int z[m][n]={....;....}

wenn ich jetzt mit meinem konstruktor ein element meiner klasse matrix matrix anlege, besitzt diese element die private eigenschaften "zeilen" und "spalten"...

wie kann ich nun mein array bzw meine matrix per eingabe füllen? verschiedene ideen bringen mich leider nicht weiter...

hier einmal meine headder datei:
C++:
class matrix
{
private:
	int zeilen;
	int spalten;
	static int anz;
	void fill();
	double **z;

public:
	matrix(int m=1, int n=1);

};
(es kommt noch einiges hinzu)


und folgendes:

C++:
#include <iostream>
#include "matrix.h"
using namespace std;

matrix::matrix(int m, int n)
{
	zeilen=m;
	spalten=n;
	
	void fill()
	
	

}


void matrix::fill()
{
	int i,k;

	for (i=0 ; i<zeilen ; i++)
	{
		for (k=0 ; k<spalten ; k++)
		{
			cin>> *z[i][k];

		}
	}



also ich möchte gerne im konstruktor meine funktion "fill" verwenden, um die matrix mit elementen zu füllen...

ich hoffe ihr könnt mir helfen..

Danke!
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich würde den Matrix-Aufbau von dir etwas überarbeiten, damit es praktischer wird damit zu arbeiten. Die fill() Funktion kann man dann anschließend im Konstruktor aufrufen.

Im Konstruktor solltest du hierbei nur den Speicher für deine Matrix allozieren.
Ein Ansatz den ich selbst verwende bzw. mehrfach gesehen habe ist das du dir eine Klasse Zeile schreibst, welche ein dynamisches Array ist, welches den Platz von Anzahl Spalten Feldern reserviert. Die Matrix ist wiederum ein dynamsiches Array aus Zeilen. Wenn du nun die []-Operatoren überlädst kannst du wie gewollt auf die einzelnen Elemente zugreifen.

Grüße,
Jennesta

Zum besseren Verständnis nun doch ein vereinfachtes Beispiel.
Ich hoffe beim entfernen der unwichtigen Daten haben sich da keine Fehler eingeschlichen.

matrix.h
C++:
class Zeile2
{
	Values *z;
	int size;
public:
	Zeile2(int s);
	~Zeile2();

	Values &operator[] (int i) throw(std::out_of_range);

};


class Matrix2
{
	Zeile2 **mat;
	int lines, cols;
public:
	Matrix2(int z, int s);
	~Matrix2();
	int getLines() const;
	int getCols() const;

	Zeile2 &operator[](int i) throw(std::out_of_range);

};

matrix.cpp
C++:
// Zeile2
Zeile2::Zeile2(int s) {
	size = s;
	z = new Values[s];
}

Zeile2::~Zeile2() {
	delete[] z;
}

Zeile2 &Matrix2::operator[](int i) throw(std::out_of_range) {
	if(i<0 || i>=lines)
		throw std::out_of_range(string("Zeilenindex: Out of Range\n").append(to_string(i)).append("<-\n"));
	else
		return *mat[i];
}


// Matrix2
Matrix2::Matrix2(int z, int s) {
	lines = z;
	cols = s;
	mat = new Zeile2*[lines];
	for(int i=0; i<lines; i++)
		mat[i] = new Zeile2(cols);
}

Matrix2::~Matrix2() {
	for(int i=0; i<lines; i++)
		delete mat[i];
	delete[] mat;
}
int Matrix2::getLines() const {
	return lines;
}

int Matrix2::getCols() const {
	return cols;
}
 
Hi, danke für deine schnelle Antwort.
ich versuche gerade deine sachen zu verstehen.


ein paar fragen habe ich dennoch...
also wenn ich das richtig sehe, definierst du eine neue Klasse "zeile" in der du den [] operator überlädst. soweit so gut.

deine klasse hat kein private.. ist das wichtig?

und was bedeutet bspw: Values &operator[] (int i) throw(std::eek:ut_of_range)
das Values.

wir benutzen immer wenn wir das ausgeben, das "cout<<"
 
Values ist mein selbst definierter Datentyp, den ich für die Matrixelemente definiert habe. Da ich in einer Zelle mehr als nur eine Variable speichern musste nutzte ich diesen. Du kannst das Values aber in der Regel gegen eigene Typen oder Standardtypen wie int oder double tauschen.

Das "throw(std::eek:ut_of_range)" ist nicht unbedingt notwendig, zeigt aber dem Benutzer an, dass diese Methode (sofern ein Fehler auftritt) eine Exception dieses Typs werfen kann. Falls man also unsicheren Input bzgl des Datenzugriffs hat kann man diese Zugriffe in einen try-catch-Block fassen.

Meine Klasse hat sehr wohl private, jedoch habe ich es nicht explizit hingeschrieben. Bei C++ ist jedes Objekt einer Klasse erstmal private (daher das ausgelassene "private:"), sofern nicht anders wie mit "public:" angegeben.


Vergessen habe ich auch noch:

C++:
Values &Zeile2::operator[](int i) throw(std::out_of_range) {
	if(i<0 || i>= size)
		throw std::out_of_range(string("Spaltenindex: Out of Range\n ->").append(to_string(i)).append("<-\n"));
	else
		return z[i];
}

womit du an die Werte kommst.
 
Zuletzt bearbeitet:
Achso, Du musst wissen, dass meine C/C++ kenntnisse sehr beschränkt sind... (ich bin erst im dritten Semester).

ich habe mein Problem jetzt folgendermaßen gelöst:
C++:
#include <iostream>
#include "matrix.h"
using namespace std;

matrix::matrix(int m, int n)
{
	zeilen=m;
	spalten=n;
	 


 A = new double* [zeilen];		//Pointer auf Zeilen

	 for (int i = 0; i < zeilen; i++) 
	  {

	  A[i] = new double[spalten]; 

	  }
	 int aussage;
	 cout<<"moechten Sie die Matrix jetzt mit Elementen fuellen?"<<endl;
	 cin>>aussage;


	 if(aussage==0)					//aussage=nein
     {
          for (int i = 0; i < zeilen; i++) 
             { 
				for (int k = 0; k < spalten; k++) 
				 { 
					A [i] [k]=0; 
				 }
			 }
	 }

	 else if(aussage==1)			//aussage=ja

	 {
        for (int i = 0; i < zeilen; i++) 
         { 
	        for (int k = 0; k < spalten; k++) 
	           { 
	              cout << "Geben sie das Matrixelement a" << i+1 << k+1 <<" ein: "; 

				  cin >> A [i] [k]; 
	           }
        }
	 }
 
}


damit kommen wir auch schon zu meinem nächsten Problem... die arithmetischen operatoren +, -, * möchte ich auch definieren...

bisher bin ich soweit: 


matrix matrix::operator+ (matrix A)
{
	if(A.zeilen!=zeilen || spalten!=A.spalten)
	{
	cout<<"Die Matrizen haben unterschiedliche groesse und koennen daher nicht addiert werden!"<<endl;
	}
	else if(A.zeilen==zeilen && spalten==A.spalten)
	{
		matrix erg(zeilen,spalten);

		for (int i = 0; i < zeilen; i++) 
 { 
	for (int k = 0; k < spalten; k++) 
	 { 
	 erg[i][k]=A[i][k]+A[i][k];
	 }
 }

	}


}
funktioniert leider nicht... im Prinzip müsste mein "+" den konstruktor für die Matrix "erg" aufrufen und die matrix erstmal mit nullen füllen...
Problem 2 ist. ich weiß nicht wie ich an die einzelnen elemente bzw indexeinträge der matrizen komme, die ich addieren will...
 
Zuletzt bearbeitet von einem Moderator:
Hi,

also ich greife auf die Matrix-Elemente z.B. folgendermaßen zu. Das ist ein Ausschnitt von meinem Code.

C++:
void ContourMatrix::setContourValuesInt(int value) {
	contourValueInt = value;
	for(int i=0; i<lines; i++) {
		for(int k=0; k<cols; k++) {
			(*this)[i][k].value < value ? (*this)[i][k].mvalue = 0 : (*this)[i][k].mvalue = 1;
		}
	}
}

Um den Plus-Operator zu überladen würde ich etwas anders herangehen.
Ich vermute mal du willst nämlich, dass der Operator folgendermaßen funktioniert: c = a+b

Dann könntest du den Operator z.B. folgendermaßen überladen:

C++:
const Matrix operator+(Matrix const& a, Matrix const& b)
{
 Matrix c;
	for(int i=0; i<lines; i++) {
		for(int k=0; k<cols; k++) {
  c[i][k] = a[i][k] + b[i][k]
}
}
  return c;
}

Das addieren habe ich jetzt aus dem Kopf geschrieben, aber sollte sinngemäß so funktionieren. Sonst schau mal hier bei dem Beispiel nach http://public.beuth-hochschule.de/~kempfer/skript_cpp/Kap11.html
 
Zuletzt bearbeitet:
Bei mir geht hier gar nichts :-( der + operator darf nur 1 argument bekommen, sagt der mir immer...

desweiteren sagt der immer, dass [] kein operant ist....
 
Hi,
hast du denn den []-Operator auch überladen? Poste mal deinen gesamten Code, dann schau ich mir das mal an.
 
Hallo, sry dass ich mich solange nicht gemeldet habe. Ich bin inzwischen etwas weiter... Kann ich dir die Dateien vielleicht auch per PN schicken oder sowas? ich habe zurzeit ein Problem mit dem zuweisungsoperator "=". wenn ich etwas schreibe wie: c=a+b dann haben nach dieser operation alle matrizen die gleichen elemente von a...

ich habe eigentlich auch alles gut kommentiert, damit da jeder reinsteigt. mein programmierstil weicht sicherlich von euren ab^^
 
Hallo,
du kannst mir natürlich gerne eine PN mit dem Code schicken, aber poste doch die relevanten Dateien lieber hier, sodass ggf auch andere helfen können. Auch ich kann nicht alles ;)
Ich kann dir nur nicht versprechen, dass ich dieses Wochenende noch Zeit dazu finden werde.

Viele Grüße,
Jennesta
 
Zurück