Dynamicky vytvorená matica (C++; Visual Studio)

Programovacie jazyky, rady, poradňa...
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

Čaute, mám viacej otázok, prvá je prečo keď si v hlavnom súbore vytvorím maticu takto(↓) tak mi to vypíše 2 krát tú istú maticu? a pri tom v konštruktore pri vytvorení matice ju napĺňam náhodnými číslami. (3 je počet riadkov, 4 je počet stlpcov, 9 max. hodnota náhodne generovaných čísel)
2. otázka, ako spravím Transponovanú maticu tak aby mi to z matice MxN spravilo NxM a potom keď zavolám funkciu Vypis ju to vypísalo? (teraz mi to spraví transponovanú maticu a vo funkcií Transponuj mi ju aj vypíše, ale ono to zmení tú maticu len v tej funkcií, keď ju dám vypísať tak mi vypíše tú maticu pred tým ako som ju "zmenil"), chcem aby ju to po zavolaní funkcie Transponuj zmenilo a potom ked dam Vypis tak aby to vypisvalo tu zmenenu maticu
Ďakujem za rady :)
main()

Kód: Vybrať všetko

   Matica prva(3,4,9);
	Matica druha(3,4,9);

	prva.Vypis();
	cout << "===============" << endl;
	druha.Vypis();
Matica.h

Kód: Vybrať všetko

#pragma once

class Matica
{
private:
	int ** m_matica1;
	int m_riadok;			// počet riadkov 
	int m_stlpec;			// počet stlpcov
	int m_max;			// maximalna hodnota prvku v matici

public:
	Matica(void);
	Matica(int riadok, int stlpec, int max);
	Matica(const Matica & m);
	~Matica(void);
	

	int getRiadok() const {return m_riadok;}
	int getStlpec() const {return m_stlpec;}
	int getMax() const {return m_max;}

	void Vypis();			  //Funkcia na Vypis matice
	void Generuj(int riadok, int stlpec, int max);
	void Transponuj();
};
Matica.cpp

Kód: Vybrať všetko

#include "StdAfx.h"
#include "Matica.h"
#include <iostream>
using namespace std;
#include <ctime>


Matica::Matica(void):						//Konštruktor bez parametrov vytvorí maticu 2x2 a naplni ju nahodnymi cislami od 0 po 9
	m_riadok(2),
	m_stlpec(2)

{
	srand((unsigned int) time(NULL));		//vytvorenie generatora nahodnych cisel
	int max=9;
	int min=0;

	m_matica1 = new int* [m_riadok];

	for(int i=0; i<m_riadok; i++)
	{
		m_matica1[i] = new int[m_stlpec];  // pole pre každý riadok
	}

	for (int i=0; i<m_riadok; i++)
	{
		for (int j=0; j<m_stlpec; j++)
		{
			m_matica1[i][j]= rand() % (max - min + 1) + min;		//nahodne naplnenie matice cislami v intervale <min,max>
		}
	}
}


  
Matica::Matica(int riadok, int stlpec, int max) :				// Vytvori maticu s rozmermy MxN, ktoré zadá užívateľ s max. hodnotou nahodnych cisel,
	m_riadok(riadok),											// ktoré tiež zadá užívateľ
	m_stlpec(stlpec),
	m_max(max) 

{
	m_matica1 = new int* [riadok];
	int min=0;
	srand((unsigned int) time(NULL));

	for(int i=0; i<riadok; i++)
	{
		m_matica1[i] = new int[stlpec];  // pole pre každý riadok
	}


	for (int i=0; i<m_riadok; i++)
	{
		for (int j=0; j<m_stlpec; j++)
		{
			m_matica1[i][j]= rand() % (max - min + 1) + min;		//naplnenie matice nahodnymi cislami
		}
	}
}

Matica::Matica(const Matica & m)
{
	this->m_riadok = m.m_riadok;
	this->m_stlpec = m.m_stlpec;
	this->m_matica1 = m.m_matica1;


	for (int i=0; i<m.m_riadok; i++)
	{
		for (int j=0; j<m.m_stlpec; j++)
		{
			this->m_matica1[i][j]= m.m_matica1[i][j];		
		}
	}
}

Matica::~Matica(void)
{
	for (int i=0; i<m_riadok; i++)
	{
		delete [] m_matica1[i];			
	}
	delete [] m_matica1;
	
}



void Matica::Generuj(int riadok, int stlpec, int max)
{
	srand((unsigned int) time(NULL));
	int min=0;
	for (int i=0; i<m_riadok; i++)
	{
		for (int j=0; j<m_stlpec; j++)
		{
			m_matica1[i][j]= rand() % (max - min + 1) + min;		
		}
	}
}



//void Matica::Transponuj(int matica1, int riadok, int stlpec)
void Matica::Transponuj()
{
	for (int i=0; i<m_stlpec; i++)
	{
		for (int j=0; j<m_riadok; j++)
		{
			m_matica1[j][i] = m_matica1[j][i];	
			cout.width(3);
			cout << m_matica1[j][i];
		}
		cout << endl;
		cout << endl;
	}
}


void Matica::Vypis()
{	
	for (int i=0; i<m_riadok; i++)
	{
		for (int j=0; j<m_stlpec; j++)
		{
			cout.width(3);				//zarovnanie cisel
			cout << m_matica1[i][j];
		}
		cout << endl;
		cout << endl;
	}
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

1.) Funkciu srand zavolaj raz na začiatku programu. Ty ju voláš vždy v konštruktore a dávaš jej ako seed čas. Lenže tie objekty sa vytvoria tak rýchlo, že jej ten seed dáš rovnaký - čas sa nestihne zmeniť.

2.) Musíš si vytvoriť novú maticu (2D pole), do ktorej uložíš transponovanú. Totiž ak máš maticu(teda pole) 2x10, musíš si vytvoriť pole 10x2. Inak ju nemáš kam narvať.
To staré potom zmazať a nahradiť novým.
Ak ti ide len o výpis, stačí to kľudne riešiť len nejakou premennou je/nie je transponovaná a meniť metódu Vypis()

btw. toto je mindfuck :D

Kód: Vybrať všetko

m_matica1[j][i] = m_matica1[j][i];
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

Nejde len o výpis, chcem s tým potom ešte ďalej pracovať, ale nie som si istým tým mazaním v deštruktore a stále mi tá transponovaá nerobí to čo by mala \:

Kód: Vybrať všetko

Matica::~Matica(void)
{
	for (int i=0; i<m_riadok; i++)
	{
		delete [] m_matica1[i];
	}
	delete [] m_matica1;

	
	for (int i=0; i<m_riadok; i++)
	{
		delete [] m_matica2[i];		
	}
	delete [] m_matica2;
	
}

Kód: Vybrať všetko

void Matica::Transponuj()
{
	m_matica2 = new int* [m_stlpec];

	for(int i=0; i<m_stlpec; i++)
	{
		m_matica2[i] = new int [m_riadok];  
	}

	for (int i=0; i<m_stlpec; i++)
	{
		for (int j=0; j<m_riadok; j++)
		{
			m_matica2[j][i] = m_matica1[j][i];	
			cout.width(3);
			cout << m_matica2[j][i];
		}
		cout << endl;
		cout << endl;
	}
	for (int i=0; i<m_riadok; i++)
	{
		for (int j=0; j<m_stlpec; j++)
		{
			m_matica1[i][j] = m_matica2[j][i];	
		}
	}
}
Prílohy
yyyyyyy.jpg
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Metóda Transponuj by mala vyzerať nejak takto

Kód: Vybrať všetko

swap( m_riadok, m_stlpec ); // vymenis tieto dve
int ** matica2 = new int* [m_riadok];
for( i = m_riadok... )
    matica2 = new int[m_stlpec];

for ...
  for ...
    matica2[i][j] = m_matica1[a][b]; // kde a,b budu vhodne vybrane - transponovane - prvky 

for ( i = m_stlpce... // tuto pozor, uz si vymenene!
    delete [] m_matica1[i];
delete [] m_matica1;

m_matica1 = matica2;
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

funguje to, ďakujem :)

ešte by som chcel s týmto poradiť
Sčítanie matíc

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
	this->m_riadok = m2.m_riadok;
	this->m_stlpec = m2.m_stlpec;

	if ((m_riadok == m2.m_riadok) && (m_stlpec == m2.m_stlpec))
	{
		for (int i=0; i<m_riadok; i++)
		{
			for (int j=0; j<m_stlpec; j++)
			{
				this->m_matica1[i][j] = m_matica1[i][j] + m2.m_matica1[i][j];			
			}
		}
	return (*this);
	}
	else 
	{
			throw Rozmery();
	}
	return (*this);
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Nevidím položenú žiadnu otázku, ale každopádne:
Nemôžeš vracať Matica a do returnu dať *this, pretože tým sa zavolá kopírovací konštruktor a vytvoríš nový objekt. Lenže ty tým ten pôvodný objekt zmeníš, čiže ti ostanú dve výsledné matice a jedna pôvodná. Buď vracaj odkaz na Matica (Matica&) a do returnu *this - tým vrátiš odkaz na objekt, ktorý sčítanie vyvolal, ostane ti tak jedna pôvodná a druhá výsledná, alebo v metóte vytvor nový objekt - tretí a vráť ten. Tak ti ostanú dve pôvodné a jedna výsledná.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

Nerozumiem, čo tam mám presne napísať do tých dvoch returnov? a kedy mám vymazať tú tretiu maticu?

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
	if ((m_riadok == m2.m_riadok) && (m_stlpec == m2.m_stlpec))
	{
		this->m_riadok = m2.m_riadok;
		this->m_stlpec = m2.m_stlpec;

		m_matica3 = new int* [m_riadok];
		for(int i=0; i<m_riadok; i++)
		{
			m_matica3[i] = new int[m_stlpec];
		}


		for (int i=0; i<m_riadok; i++)
		{
			for (int j=0; j<m_stlpec; j++)
			{
				this->m_matica3[i][j] = m_matica1[i][j] + m2.m_matica1[i][j];			
			}
		}

		for (int i=0; i<m_riadok; i++)               
		{
			delete [] m_matica3[i];
		}
		delete [] m_matica3;

	RETURN?
	}
	else 
	{
		throw Rozmery();
	}
	RETURN?
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Ach, ty nemusíš všetko pchať do členských premenných :) Objekt Matica má v sebe len jednu maticu, nie dve, ani tri.
Máš tam mať len int ** m_matica; a s touto pracovať podľa potreby.
Urob si metódu zmazMaticu(), v ktorej zmažeš m_matica a podľa potreby ju nahrádzaj inou (rovnako dynamicky alokovanou pomocou new). Napr. si novú maticu vytvoríš v tej metóde Transponuj a nahradíš to ňou - tak ako som ti to napísal vyššie.
Tu ale je lepšie vytvoriť tretí objekt Matica, sčítať tie dve do neho a vrátiť ten.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

v postate tretí objekt mám, sčítané tie dve v ňom tiež ale neviem ako ho mám vrátiť, neviem čo tam napísať do return ; a neviem kedy vymazať ten tretí objekt, v podstate chcem len vedieť ako upraviť to čo som sem dal naposledy tak aby to fungovalo, viem že si to už napísal, ale(bohužial) som tomu neporozumel, mohol by si to napísať presne akoby som to mal mať v tom programe?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

No tak takto. Dokážeš si spraviť funkciu na sčítanie dvoch matíc, ktoré ti vrátia výslednú a tie dve, ktoré do toho vstúpili, nechá nedotknuté? Určite vieš, je to ľahké :)
Zavoláš funkciu nejako takto:

Kód: Vybrať všetko

Matica m1;
Matica m2;
Matica m3;
scitajMatice( m3, m1,m2 );
Toto je taký ten "starý C-čkovský" spôsob. Funkcia zoberie prvý argument ako maticu, do ktorej má dať výsledok sčítania m1+m2.

Určite vieš urobiť aj to, aby tá funkcia výslednú maticu vrátila.

Kód: Vybrať všetko

Matica m1;
Matica m2;
Matica m3;
m3 = scitajMatice( m1,m2 );
(Pozor, tu sa už volá operátor=, je potrebná hlboká kopia!)

No a teraz trochu objektový spôsob.

Kód: Vybrať všetko

Matica m1;
Matica m2;
Matica m3;
m3 = m1.scitajsMaticou( m2 );
Toto je to isté, ako to pred tým, ale v metóde sa pracuje s this (to je v tomto prípade m1, pretože tá vyvolala svoju metódu) a s parametrom (to je m2) No a vráti sa nejaká tretia matica, rovnako ako v predchádzajúcich spôsoboch.

No a to, čo máš ty, nie je nič iné, ako

Kód: Vybrať všetko

Matica m1;
Matica m2;
Matica m3;
m3 = m1.operator+( m2 );
// skrátene m3 = m1 + m2;
Čiže čo bude návratová hodnota? No hotová výsledná Matica :)
Len ešte implementuj operator=, ktorý vyvoláva m3, ako hlbokú kópiu (stačí volať kopírovací konštruktor, ktorý už máš hotový)

Ak ti ešte niečo niekde nie je jasné, pýtaj sa konkrétnejšie.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

V prvom rade ti chcem poďakovať za ochotu, wow s tak ochotným človekom som sa už dávno nestretol :) ..momentálne sa musím učit na 2 zápočty zajtra+spravit jedno zadanie a druhé je táto matica, toto je posledná vec ktorá mi tam chýba a neviem či to stihnem, lebo tomu nerozumiem až tak ako ty napríklad. Chcem tým povedať že sa na to nesústredím až tak ako by som sa chcel kedže ma tlačí čas a zajtra musím všetko odovzdať, ak máš ešte chuť a čas tak čo je zle na tom keď v main() si dám toto(↓) ale nespraví mi to nič lebo mám chybu v tom operatore a neviem ju odstranit ani po tvojích radách, pozri sa ešte raz na to prosím a skontroluj/oprav mi to, vďaka. Toto je dobre? [return Matica(m_matica3);]

Kód: Vybrať všetko

Matica jedna(2,2,5);
Matica dva(2,2,5);
Matica tri(2,2,5);
	
	try
	{
	tri = dva + jedna;
	}
	catch (Matica::Rozmery)
	{
		cout << "CHYBA v ROZMEROCH" << endl;
	}
	tri.Vypis();

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
	if ((m_riadok == m2.m_riadok) && (m_stlpec == m2.m_stlpec))
	{
		this->m_riadok = m2.m_riadok;
		this->m_stlpec = m2.m_stlpec;

		m_matica3 = new int* [m_riadok];
		for(int i=0; i<m_riadok; i++)
		{
			m_matica3[i] = new int[m_stlpec];
		}


		for (int i=0; i<m_riadok; i++)
		{
			for (int j=0; j<m_stlpec; j++)
			{
				this->m_matica3[i][j] = m_matica1[i][j] + m2.m_matica1[i][j];			
			}
		}

		for (int i=0; i<m_riadok; i++)               
		{
			delete [] m_matica3[i];
		}
		delete [] m_matica3;

	return Matica(m_matica3);
	}
	else 
	{
		throw Rozmery();
	}
	return Matica(m_matica3);
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Mick_14 napísal:V prvom rade ti chcem poďakovať za ochotu, wow s tak ochotným človekom som sa už dávno nestretol :)
To možno nie je ani tak ochota, ako semestrálka z prekladačov :D Robím všetko, len tú nie.

A ty si najprv naplníš m_matica3 a potom si ju zmažeš? Prečo?! :cry: Veď v tom return Matica(m_matica3) máš zmazanú maticu. Preč s tými deletmi.
Inak sa to zdá dobre. Len trú m_matica3 nemaj ako členskú. Vytvor si ju kľudne priamo v metóde. Síce potom ju nemáš ako zmazať no. To by si musel vytvoriť objekt, dať tomu parameter matica3, zmazať ju a až potom return ten objekt.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

deleti sú preč, m_matica3 nie je ako členská ale nefunguje to, ked ju nebudem mat ako zmazať to bude dost problém asi nie?

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
	if ((m_riadok == m2.m_riadok) && (m_stlpec == m2.m_stlpec))
	{
		this->m_riadok = m2.m_riadok;
		this->m_stlpec = m2.m_stlpec;

		int ** m_matica3;
		m_matica3 = new int* [m_riadok];
		for(int i=0; i<m_riadok; i++)
		{
			m_matica3[i] = new int[m_stlpec];
		}


		for (int i=0; i<m_riadok; i++)
		{
			for (int j=0; j<m_stlpec; j++)
			{
				this->m_matica3[i][j] = m_matica1[i][j] + m2.m_matica1[i][j];
			}
		}

	return Matica(m_matica3);
	zmazMaticu();
	}
	else 
	{
		throw Rozmery();
	}
	return Matica(m_matica3);
	zmazMaticu();
}

Chybové hlášky:

Kód: Vybrať všetko

1>Matica.cpp(181): error C2039: 'm_matica3' : is not a member of 'Matica'
1>          c:\users\michal \music\downloads\documents\visual studio 2010\projects\semestrane_zadanie\semestrane_zadanie\Matica.h(4) : see declaration of 'Matica'
1>Matica.cpp(191): error C2440: '<function-style-cast>' : cannot convert from 'int **' to 'Matica'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Ešte nejaké "nápady" ako to spojazdniť?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

jajajajaj celé zle. Prepisuješ si veci veľmi divoko a tie returny... Za return sa ti predsa už nič nedostane, funkcia sa opustí. Kód za tým sa nikdy nevykoná.
Takto nejako by to malo byť a nemusíš ani šachovať s tým tretím polom

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
   if ((m_riadok != m2.m_riadok) || (m_stlpec != m2.m_stlpec))
      throw Rozmery();
   else
   {
      Matica vysledna( m_riadok, m_stlpec, neviemCo );

      for (int i=0; i<m_riadok; i++)
      {
         for (int j=0; j<m_stlpec; j++)
         {
            vysledna.m_matica1[i][j] = this->m_matica1[i][j] + m2.m_matica1[i][j];
         }
      }

   return vysledna;
   }
}
Pri return vysledna; sa zavola kopírovací konštuktor (to isté, akoby som napísal return Matica(vysledna)) a následne deštruktor na vysledna. Tá sa zmaže - to musí, lebo je to lokálna premenná a metóda vráti hotovú maticu.
K prvkom objektu vysledna môžeš pristupovať priamo, pretože pracuješ v jej triede.

Mohol som ti to hneď napísať takto, len ma to nenapadlo, keď som tam videl tie polia všeliaké.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

Skoro dobre, len ešte bude asi chyba s tým vymazávaním, už to nepotrebujem do školy, ale rád by som vedel kde je tá chyba :D

main()

Kód: Vybrať všetko

Matica a(1,1,3);
	Matica b(1,1,3);
	a.Vypis();
	cout << "\n======================================\n";
	b.Vypis();
	cout << "\n======================================\n";
	a = a+b;
	a.Vypis();
Matica.cpp

Kód: Vybrať všetko

Matica Matica::operator+ (const Matica & m2)
{
   if ((m_riadok != m2.m_riadok) || (m_stlpec != m2.m_stlpec))
      throw Rozmery();
   else
   {
      Matica vysledna( m_riadok, m_stlpec, m_max );

      for (int i=0; i<m_riadok; i++)
      {
         for (int j=0; j<m_stlpec; j++)
         {
            vysledna.m_matica1[i][j] = this->m_matica1[i][j] + m2.m_matica1[i][j];
         }
      }

   return vysledna;
   }
}
Prílohy
sem.jpg
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Pošli celý program, mrknem na to. Ideálne do jedného súboru, nech to nemusím zliepať :)
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

S tým jedným súborom som ti asi nevyhovel, neviem jak si to myslel
Prílohy
matica.rar
(2.76 KiB) 40 stiahnutí
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Tak som sa s tým trochu pohral a urobil tak, ako by to malo naozaj vyzerať :) Pridal som svoje komentáre, tvoje som odstránil a tiež som odstránil tie gettre a settre, ktoré boli dosť odporné. Dúfam, že si to s nimi nemyslel vážne.
V OOP je dobrá zásada čo najviac využívať už hotové veci. Čo najmenej by si mal pouźívať viac krát rovnaký kód (napr. ako si mal ty to večné mazanie)
Keby niečo, pýtaj sa.
Prílohy
main.cpp.zip
(1.43 KiB) 41 stiahnutí
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa Mick_14 »

ok, tak ešte teória teda:
1. Čo by sa stalo keby boli tie pomocné metódy "AlokujMaticu" a "ZmazMaticu" v public? (v čom by to fungovalo inak?)

2. Prečo boli tie gettre a settre až tak zlé?

3. Matica & operator= (const Matica & m2); Prečo pri operatore= musí byť referencia na triedu a pri operátore+ nemusí?
Matica operator+ (const Matica & m2);

4. V kopírovacom konštruktore *this = m; a vo funkcií Transponuj() *this = vysledna; ...prečo toto priradenie? a čo robí/čo to vlastne je to *this?

5. tak isto na konci operatoru= nerozumiem
this->m_matica1[j]= m2.m_matica1[j]; akú úlohu tam zohrá to this, keď to funguje aj bez toho?
return (*this); vraciam smerník na this a to this predstavuje čo?

6. Pri operator+ v cykle vysledna.m_matica1[j] = this->m_matica1[j] + m2.m_matica1[j]; ..zas ten this prečo je zrovna pred m_matica[j];?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Dynamicky vytvorená matica (C++; Visual Studio)

Príspevok od používateľa BX »

Uf, ja som myslel, že si aspoň základnú teóriu o OOP v C++ prebral. Ak by som chcel poriadne odpovedať na všetky tieto otázky, napísal by som tu celý článok a zhrnul skoro celý objektový princíp v C++.
Preto pochopíš, ak ťa len odkážem na nejakú knihu, či iný článok, kde sa OOP vysvetľuje poriadne.
Ale aspoň námatkovo a v skratke:
1.) Fungovalo by to rovnako, rozdiel je len v prístupe k tým metódam. Viz kľúčové slová public, private a protected a rozdiel medzi nimi.
2.) Ak chceš na všetko gettre a settre, nemusíš robiť objekt. Objekty sú o tom, že chceš mať "inteligentné dáta", ktoré robia to, čo im povieš (prostredníctvom triednych metód) Viz objektový princíp a návrh
3.) Nemusí, ale robí sa to tak, pretože to zaručí to chovanie, ktoré sa od takýchto operátorov predpokladá.
4.) this je ukzateľ na objekt, ktorý metódu vyvolal. Jeho dereferenciou získaš práve ten objekt.
5.) 6.) this->m_matica1... je tam len kvôli prehľadnosti. Keď pracujem v metóde s viacerými objektami rovnakej ("mojej") triedy, tak sa tak ľahko odlíši, čo patrí mne a čo nie. Totiž pri všetkých tých m-kách sa tam dá ľahko stratiť. Niekedy to ale má aj iný význam, ale vždy sa jedná len o zvýraznenie toho, čo chcem volať.
Napísať odpoveď