Перегрузка Операторов

Тема в разделе "C/C++/C#", создана пользователем XADD, 23 окт 2011.

Статус темы:
Закрыта.
  1. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Перегрузил операцию сложения двух двоичных чисел но оно работает частично
    Например если присвоить s1=111,s2=111, то s3=s1+s2=1110(вроде бы верно), далее пишу s3+s1=(1110+111) программа выдает s3=111 хотя должно быть 10101. Дебагом пользовался но не могу понять что не работает.

    Код (C++):
    #include <iostream>
    #include <cmath>
    #include <math.h>
    using namespace std;
    class Stroka
    {
    private:
    char *String;
    int SizeOfString;
    public:
    Stroka() {}
    Stroka(const char *inString)
    {
    String = new char[strlen(inString)];
    if (inString!=0) strcpy(String,inString);
    cout << "String constructor" << endl;
    }
    Stroka(char ch)
    {
    String=new char[strlen(&ch)];
    if (ch!=0) strcpy(String,&ch);
    cout << "Symbol constructor" << endl;
    }
    Stroka (const Stroka& copy)
    {
    copy.String;
    cout << "Copy constructor" << endl;
    }
    void GetClear ()
    {
    String="\0";
    }
    int GetLength ()
    {
    SizeOfString=strlen(String);
    cout << SizeOfString << endl;
    return SizeOfString;
    }
    void Show ()
    {
    cout << String << endl;
    }
    };
    class BitStroka
    {
    private:
    char *BitString;
    int SizeOfBitString;
    int Value;
    public:
    ////-------------------
    BitStroka() {BitString = new char[10]; SizeOfBitString=0; Value=0;}
    ////---------------------
    //BitStroka(const BitStroka&);
    BitStroka(const char *InBitString)
    {
    int iterator=0;
    for (int i=0; i<strlen(InBitString);i++)
    {
    if (InBitString[i]=='0' || InBitString[i]=='1') {iterator++;}
    if (iterator==strlen(InBitString))
    {
    BitString = new char[strlen(InBitString)];
    strcpy(BitString,InBitString);
    SizeOfBitString=strlen(InBitString);
    Value=atoi(InBitString);
    }
    }
    }

    friend BitStroka& operator+(const BitStroka &op1, const BitStroka &op2)
    {

    BitStroka temp;
    int *temp1;
    int *temp2;
    int *temp3;

    if (op1.SizeOfBitString<op2.SizeOfBitString)
    {
    temp1 = new int[(op2.SizeOfBitString+1)];
    temp2 = new int[(op2.SizeOfBitString+1)];
    temp3 = new int[(op2.SizeOfBitString+1)];
    for (int i=0;i<(op2.SizeOfBitString+1);i++)
    {
    temp1[i]=0;
    temp2[i]=0;
    }
    for (int i=0;i<op1.SizeOfBitString;i++)
    {
    temp1[i+(op2.SizeOfBitString+1-op1.SizeOfBitString)]=op1.BitString[i]-'0';
    }
    for (int i=0;i<op2.SizeOfBitString;i++)
    {
    temp2[i+1]=op2.BitString[i]-'0';
    }
    int carry=0;
    int temp4=0;
    for (int i=op2.SizeOfBitString;i>=0;i--)
    {
    temp4=temp1[i]+temp2[i]+carry;
    if (temp4>=2) {temp3[i]=temp4-2; carry=1;}
    else {temp3[i]=temp4; carry=0;}
    }
    int j=0;
    int k=1;
    for (int i=op2.SizeOfBitString;i>=0;i--)
    {
    j+=temp3[i]*pow(10.0,k-1);
    k++;
    }
    temp.Value=j;
    cout << "First" << endl;
    }
    else
    {
    temp1 = new int[(op1.SizeOfBitString+1)];
    temp2 = new int[(op1.SizeOfBitString+1)];
    temp3 = new int[(op1.SizeOfBitString+1)];
    for (int i=0;i<(op1.SizeOfBitString+1);i++)
    {
    temp1[i]=0;
    temp2[i]=0;
    temp3[i]=0;
    }
    for (int i=0;i<op2.SizeOfBitString;i++)
    {
    temp1[i+(op1.SizeOfBitString+1-op2.SizeOfBitString)]=op2.BitString[i]-'0';
    }
    for (int i =0;i<op1.SizeOfBitString;i++)
    {
    temp2[i+1]=op1.BitString[i]-'0';
    }
    int carry=0;
    int temp4=0;
    for (int i=op1.SizeOfBitString;i>=0;i--)
    {
    temp4=temp1[i]+temp2[i]+carry;
    if (temp4>=2) {temp3[i]=temp4-2; carry=1;}
    else {temp3[i]=temp4; carry=0;}
    }
    int j=0;
    int k=1;
    for (int i=op1.SizeOfBitString;i>=0;i--)
    {
    j+=temp3[i]*pow(10.0,k-1);
    k++;
    }
    temp.Value=j;

    cout << "Second" << endl;
    }

    return temp;
    }
    bool operator== (const BitStroka &op1)// Перегрузка функции сравнения
    {
    if (op1.Value==Value)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    BitStroka& operator +=(const BitStroka &op1)//Функция присвоения
    {
    SizeOfBitString=op1.SizeOfBitString;
    Value=op1.Value;
    return *this;
    }
    void Show()
    {
    cout << Value << endl;
    }
    };
    int main()
    {
    BitStroka s1("111");
    BitStroka s2("111");
    BitStroka s3("111");
    s3=(s1+s2);
    s3=(s3+s1);
    s3.Show();
    return 0;
    }
     
  2. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Топик можно закрыть разобрался где ошибка, устранить пытаюсь.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей