Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Macierze- przeciążenie operatorów

Ostatnio zmodyfikowano 2015-04-21 20:14
Autor Wiadomość
wersob95
Temat założony przez niniejszego użytkownika
[C++] Macierze- przeciążenie operatorów
» 2015-04-20 20:44:25
Jako zadanie otrzymałam przeciążenie operatorów +, +=, -, -=, *, *= , ale nie mogę sobie poradzić nawet już z dodawaniem próbowałam już naprawdę na wiele sposobów, ale jako, że jestem początkująca nie za bardzo wychodzi. Na poprzednie zadanie mieliśmy utworzyć klasę macierzy, która wyświetla macierz wypełnioną zerami, jedynkami lub losowo 0 i 1. Rozwiązałam to jako switch-case żeby użytkownik mógł sam wybrać, którą opcje wybiera, dlatego już większość mam, teraz tylko te operatory i nie wiem jeszcze co z przyjaźnią czy jest ona potrzebna?
C/C++
#ifndef MACIERZ_H
#define MACIERZ_H
#include <iostream>
using namespace std;

class Macierz
{
    int m, n;
    int o;
    double ** tablica;
public:
    Macierz( int m, int n );
    Macierz( int m );
    ~Macierz();
    void wyswietl();
    Macierz( const Macierz & a );
    Macierz operator +( const Macierz & w );
    Macierz & operator +=( const Macierz & w );
    Macierz operator -( const Macierz & w );
    Macierz & operator -=( const Macierz & w );
    Macierz operator *( const Macierz & w );
    Macierz & operator *=( const Macierz & w );
    friend ostream & operator <<( ostream & str, const
    Macierz & b );
};

#endif // MACIERZ_H


#include "macierz.h"
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;


Macierz::Macierz( int m1, int n1 )
{
    cin >> o;
    cout << endl;
    m = m1;
    n = n1;
    tablica = new double *[ m ];
   
    switch( o )
    {
       
    case 0:
        for( int i = 0; i < m; i++ )
        {
            tablica[ i ] = new double[ n ];
            for( int j = 0; j < n; j++ )
                 tablica[ i ][ j ] = 0;
           
        }
        break;
    case 1:
        for( int i = 0; i < m; i++ )
        {
            tablica[ i ] = new double[ n ];
            for( int j = 0; j < n; j++ )
                 tablica[ i ][ j ] = 1;
           
        }
        break;
    case 2:
        for( int i = 0; i < m; i++ )
        {
            tablica[ i ] = new double[ n ];
            for( int j = 0; j < n; j++ )
                 tablica[ i ][ j ] = rand() % 2;
           
        }
        break;
        default:
        cout << "wybrano niepoprawnie";
    }
   
}
Macierz::Macierz( int m1 )
{
    m = m1;
    tablica = new double *[ m ];
    for( int i = 0; i < m; i++ )
    {
        tablica[ i ] = new double[ n ];
        for( int j = 0; j < n; j++ )
             tablica[ i ][ j ] = rand() % 2;
       
    }
}
void Macierz::wyswietl()
{
    for( int i = 0; i < m; i++ )
    {
        for( int j = 0; j < m; j++ )
             cout << tablica[ i ][ j ] << "\t";
       
        cout << endl;
    }
   
}
Macierz::Macierz( const Macierz & a )
    : m( a.m )
     , n( a.n )
{
   
}
Macierz Macierz::operator +( const Macierz & w )
{
    Macierz p( m, n );
    for( int i = 0; i < m; i++ )
    for( int j = 0; j < n; j++ )
    // p.m=i+w.i;
    // p.n=j+w.j;
         return p;
   
}
ostream & operator <<( ostream & str, const Macierz & b )
{
    str << b.m;
    if( b.n >= 0 )
         str << " ";
   
    str << b.n << " " << endl;
    return str;
}
Macierz::~Macierz()
{
    for( int i = 0; i < m; i++ )
         delete[] tablica[ i ];
   
    delete[] tablica;
}
P-131232
darko202
» 2015-04-21 08:57:36
1.
moim zdaniem zdefiniowana przez Ciebie klasa jest niepoprawna

*
 cin >> o;
w konstruktorze jest nie do przyjęcia

*
przy dodawaniu, mnożeniu macierzy ważne są wymiary
gdyż nie można wykonać tej operacji na dowolnej parze macierzy
brak warunków kontrolnych


2.
przeczytaj o przeciążaniu
http://www.google.pl/url?sa=t​&rct=j&q=&esrc=s&source=web​&cd=6&ved=0CEAQFjAF​&url=http%3A%2F%2Fnauka-program​owania.pl%2FO2.PDF​&ei=5-01VffAIMWvygPf5IHoAg​&usg=AFQjCNF4pF98kHVIYwQ8HQU_b​qAq7P9-Bg​&bvm=bv.91071109,d.bGg

i rozwiń opisywane tam przeciążanie wektora na macierz
P-131240
Monika90
» 2015-04-21 20:14:17
Na ogół operatory + - * / implementuje się za pomocą += -= *= /=, gdzie te pierwsze są zadeklarowane poza klasą i nie są zaprzyjaźnione, a te drugie są składowymi klasy.

Potrzebny będzie prawidłowo działający konstruktor kopiujący
Macierz( const Macierz & );
. Twój nie jest prawidłowy. (operator przypisania też by się przydał)

W konstruktorze
Macierz::Macierz( int m1 )
 masz błąd - składowa n nie została zainicjalizowana.

I tak jak Ci pisze darko202, sprawdzaj czy wymiary operandów się zgadzają. Jak się nie zgadzają można rzucić wyjątek.
P-131254
« 1 »
  Strona 1 z 1