przeciazenie operatora dodawwania oraz lista inicjalizacyjnacyjna konstruktora

0

Mam problem natury technicznej czyli nie przeciazyć operatora dodawania i dodac go do ciała klasy za pomocą listy inicjalizacyjnej. Nie mam na to pomysłu. Kody:

main

#include "wyznacznik.h"
using namespace std;

int main()
{
 wyznacznik wyznacz;

    return 0;
}

wyznacznik.h

#ifndef WYZNACZNIK_H
#define WYZNACZNIK_H
#include <stdlib.h>
#include <iostream>
#include <gmpxx.h>
#include <time.h>
#include <math.h>
#include "macierz.h"

using namespace std;
class wyznacznik
{
    public:
    long long int i,j,k,N,m,p;
     float** tab;

        wyznacznik();

        virtual ~wyznacznik();

    protected:
    private:
};

#endif // WYZNACZNIK_H

macierz.h

#ifndef MACIERZ_H
#define MACIERZ_H
#include <iostream>
#include "macierz.h"
#include "wyznacznik.h"
using namespace std;
class Macierz
{
public:
Macierz();
friend Macierz operator+(Macierz x, Macierz y);
friend ostream & operator<<(Macierz x, ostream y);

float** tab;
int N;
~Macierz();
};

#endif

wyznacznik.cpp

#include "wyznacznik.h"
#include "macierz.h"
wyznacznik::wyznacznik()
{

cout<<"podaj rozmiar macierzy. Wazne jest abys program zakonczyl enterem. Inaczej dekonstruktor nie zostanie wywolany ";
  cin>>N;
  time_t t;
  srand((unsigned) time(&t));
tab=new float *[N];

  cout<<"zawartosc macierzy"<<endl<<endl;

for(i=0;i<N;i++) tab[i]=new float[N];

for(i=0;i<N;i++)
for(j=0;j<N;j++)
  {
 tab[i][j]=rand()%100;

    cout<<tab[i][j]<<" ";

    if(j==N-1)cout<<endl;
  }

  Macierz macierz;

// tworzenie macierzy trojkatnej

for (k=0; k<N-1; k++)
{
  for (i=k+1; i<N; i++)
  for (j=N-1; j>=k; j--)
  tab[i][j] = tab[i][j] - tab[i][k]*tab[k][j]/tab[k][k];
}
if (N<=3) {

long long det = 1.0;

//tu wyliczamy wyznacznik po przekątnej
for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";
}

else if (N>=4 and N<=100){
mpz_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";}

else if (N>100){
mpq_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
}

cin.sync();
cin.get();
}

Macierz::Macierz(){
float x,y;

tab=new float *[N];
cout<<"podaj pierwsza wspolrzedna  ktora ma zostac dodana z osi x"<<endl;
cin>>x;

cout<<"podaj druga wspolrzedna  ktora ma zostac dodana z osi y"<<endl;
cin>>y;

//nie wiem co tutaj wpisac
}

wyznacznik::~wyznacznik()
{
    for (int i = 0; i < N; i++) delete [] tab[i];
delete tab;
}

Macierz::~Macierz(){

}

Wciąż się uczę i przepraszam za ewentualne błędy. Pozddrawiam

0

Po pierwsze to bym podzielił ten kod na funkcje składowe. Nie wiem dlaczego ale ty piszesz wszystko w konstruktorze. Konstruktor służy zazwyczaj do zainicjalizowania pól choć można go użyć w dowolnie inny sposób(jak zwykłą funckję statyczną).

0
  1. Konstruktor sluzy do inicjalizacji.
  2. Konstruktor kopiujacy to niejako obowiazek dla takich klas (ew. prywatny).
    3, Operator przypisania j/w.
  3. Po co ten operator dodawania jest friendem?
X operator+(const X& x) { return X(skladowa + x.skladowa); }
  1. Dlaczego operator << nie przyjmuje przez referencje?
friend ostream& operator<<(ostream& os, const X& x);
  • Albo robisz rowne wciecia w CALYM kodzie, albo nie rob ich wcale.

Edit: 6. WTF?

virtual ~wyznacznik();

Gdzies polimorfizmu planujesz uzyc czy przeczytales, ze sie dodaje virtual do destruktorow?

0

"Poza tym staram się zrozumieć to co tutaj mi napisaliście."

Troche o:
przeciazaniu operatorow: http://www.cplusplus.com/doc/tutorial/classes2/
przyjazni: http://www.cplusplus.com/doc/tutorial/inheritance/
magicznym slowku "virtual": http://www.cplusplus.com/doc/tutorial/polymorphism/
konstruktorze kopiujacym i operatorze przypisania: http://www.cplusplus.com/articles/y8hv0pDG/

0

Udalo mi się rozwiązać problem. Dziekuję za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1