operatory +=, -=, *=, /=, >=, <.

Odpowiedz Nowy wątek
2013-01-20 12:25
MarC000
0

Proszę o podpowiedź w jaki sposób napisać konstruktor dla operatorów +=, -=, *=, /=, >=, <.

np. dla -= mam błąd: "invalid conversion from int' tochar*'"

dla = invalid operands of types `char' and char* const' to binaryoperator*'

#ifndef DUZALICZBA_H_
#define DUZALICZBA_H_

#include <iostream>
#include <string.h>

using namespace std;

class DuzaLiczba
{
    private:
        char* m_wartosc;
        bool identyczne(const char*, const char*);
    public:
        /*
         * konstruktor bezargumentowy inicjalizuje obiekt wartością 0
         */
        DuzaLiczba();
        /*
         * konstruktor z argumentem typu int inicjalizuje obiekt wartością stało-liczbową
         */
        DuzaLiczba(int number);
        /*
         * konstruktor z argumentem typu char* inicjalizuje obiekt podaną wartością
         */
        DuzaLiczba(char* wartosc) :
            m_wartosc(strdup(wartosc))
        {
        }
        DuzaLiczba(const DuzaLiczba& object);
        ~DuzaLiczba();
        int countDigitsInInt(int number);
        DuzaLiczba& operator=(const DuzaLiczba&);
        DuzaLiczba& operator=(const char*);
        DuzaLiczba& operator=(int);
        friend bool operator==(const DuzaLiczba&, const DuzaLiczba&);
        friend bool operator==(const DuzaLiczba&, char*);
        friend bool operator!=(const DuzaLiczba&, const DuzaLiczba&);
        DuzaLiczba& operator+=(DuzaLiczba const&);
        DuzaLiczba& operator+=(int);
        DuzaLiczba& operator-=(DuzaLiczba const&);
        DuzaLiczba& operator*=(DuzaLiczba const&);
        DuzaLiczba& operator/=(DuzaLiczba const&);
        bool operator>=(DuzaLiczba const&) const;
        bool operator>=(int) const;
        DuzaLiczba operator+(DuzaLiczba);
        friend DuzaLiczba operator-(DuzaLiczba, DuzaLiczba);
        DuzaLiczba operator-();
        DuzaLiczba operator*(DuzaLiczba);
        DuzaLiczba operator/(DuzaLiczba);
        DuzaLiczba operator!();
        bool operator<(DuzaLiczba const&) const;
        bool operator<(const char*) const;
        friend ostream& operator<<(ostream&, const DuzaLiczba&);
        friend istream& operator>>(istream&, DuzaLiczba&);
};

#endif /* DUZALICZBA_H_ */
 #include <iostream>
#include <cstdio>
#include "DuzaLiczba.h"

using namespace std;

bool identyczne(char* a, char* b)
{
    bool result = true;
    while (*a != 0) {
        if (a != b)
            result = false;

        a++;
        b++;
    }
    if (*a != 0 || *b != 0)
        result = false;

    return result;
}

DuzaLiczba::DuzaLiczba()
{
    m_wartosc = new char[1];
    m_wartosc[0] = '\0';
}
DuzaLiczba::DuzaLiczba(int number)
{
    m_wartosc = new char[countDigitsInInt(number) + 1];
    sprintf(m_wartosc, "%d", number);
}
DuzaLiczba::DuzaLiczba(const DuzaLiczba& object)
{
    m_wartosc = new char[strlen(object.m_wartosc) + 1];
    strcpy(m_wartosc, object.m_wartosc);
}
DuzaLiczba::~DuzaLiczba()   //destruktor
{
    delete[] m_wartosc;
    m_wartosc = 0;
}
int DuzaLiczba::countDigitsInInt(int number)
{
    int i;

    for (i = 0; number > 0; i++)
        number = number / 10;
    if (i == 0)
        i = 1;

    return i;
}
DuzaLiczba& DuzaLiczba::operator=(const DuzaLiczba& object)
{
    if (this != &object) {
        m_wartosc = new char[strlen(object.m_wartosc) + 1];
        strcpy(m_wartosc, object.m_wartosc);
    }
    return *this;
}
DuzaLiczba& DuzaLiczba::operator=(const char* wartosc)
{
    m_wartosc = new char[strlen(wartosc) + 1];
    strcpy(m_wartosc, wartosc);
    return *this;
}
DuzaLiczba& DuzaLiczba::operator=(int number)
{
    m_wartosc = new char[countDigitsInInt(number) + 1];
    sprintf(m_wartosc, "%d", number);
    return *this;
}
bool operator==(const DuzaLiczba& a, const DuzaLiczba& b)
{
    return (identyczne(a.m_wartosc, b.m_wartosc)) ? true : false;
}
bool operator==(const DuzaLiczba& a, char* b)
{
    return (identyczne(a.m_wartosc, b)) ? true : false;
}
bool operator!=(const DuzaLiczba& a, const DuzaLiczba& b)
{
    return (identyczne(a.m_wartosc, b.m_wartosc)) ? false : true;
}
DuzaLiczba& DuzaLiczba::operator+=(DuzaLiczba const& ob)
{
  //  this->m_wartosc = this->m_wartosc + ob.m_wartosc;
  return *this;
}
DuzaLiczba& DuzaLiczba::operator+=(int num)
{
    m_wartosc = m_wartosc + num;
    return *this;
}
DuzaLiczba& DuzaLiczba::operator-=(DuzaLiczba const& ob)
{
    //this->m_wartosc = this->m_wartosc - ob.m_wartosc;
    return *this;
}
DuzaLiczba& DuzaLiczba::operator*=(DuzaLiczba const& ob)
{
//    this->m_wartosc = this->m_wartosc * ob.m_wartosc;
    return *this;
}
DuzaLiczba& DuzaLiczba::operator/=(DuzaLiczba const& ob)
{
//    this->m_wartosc = this->m_wartosc / ob.m_wartosc;
    return *this;
}
bool DuzaLiczba::operator>=(DuzaLiczba const& ob) const
{
    // nie wiem jak to zrobić
    return true;
}
bool DuzaLiczba::operator>=(int number) const
{
    // nie wiem jak to zrobić
    return true;
}
DuzaLiczba DuzaLiczba::operator+(DuzaLiczba ob)
{
   // m_wartosc += ob.m_wartosc;
     //   return DuzaLiczba(m_wartosc + ob.m_wartosc);
    return DuzaLiczba();
}
DuzaLiczba operator-(DuzaLiczba ob1, DuzaLiczba ob2)
{

    ob1.m_wartosc - ob2.m_wartosc;       
    return DuzaLiczba(ob1.m_wartosc - ob2.m_wartosc);
}
DuzaLiczba DuzaLiczba::operator-()
{
     --m_wartosc;
    return DuzaLiczba();
}
DuzaLiczba DuzaLiczba::operator*(DuzaLiczba ob)
{
       //   m_wartosc * m_wartosc;
     //  ob1.m_wartosc *= ob2.m_wartosc;
    return DuzaLiczba();
}
DuzaLiczba DuzaLiczba::operator/(DuzaLiczba ob)
{
    //    nie wiem jak to zrobić
    return DuzaLiczba();
}
DuzaLiczba DuzaLiczba::operator!()
{
    // nie wiem jak to zrobić
    return DuzaLiczba();
}
bool DuzaLiczba::operator<(DuzaLiczba const& ob) const
{
    // nie wiem jak to zrobić
    return true;
}
bool DuzaLiczba::operator<(const char*) const
{
    // nie wiem jak to zrobić
    return true;
}
ostream& operator<<(ostream& out, const DuzaLiczba& ob)
{
    out << ob.m_wartosc;
    return out;
}
istream& operator>>(istream& in, DuzaLiczba& ob)
{
    in >> ob.m_wartosc;
    return in;
}

Pozostało 580 znaków

2013-01-20 12:29
0
DuzaLiczba DuzaLiczba::operator-()
{
     --m_wartosc;
    return DuzaLiczba();
}

to jest bez sensu, najpierw wykonujesz operację na this, a potem i tak zwracasz nowy obiekt...

Pozostało 580 znaków

2013-01-20 13:02
DejaVu (cpp0x.pl)
0

http://cpp0x.pl/dokumentacja/[...]/Przeciazanie-operatorow/1042

Tylko ja mam operacje na char*. - MarC000 2013-01-20 13:13

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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