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

[C++] Błąd w destruktorze i/lub przeciążenie operatora+

Ostatnio zmodyfikowano 2015-11-06 18:40
Autor Wiadomość
adacek1
Temat założony przez niniejszego użytkownika
[C++] Błąd w destruktorze i/lub przeciążenie operatora+
» 2015-11-06 11:51:08
Klasa Number

C/C++
#include <string>
#define  DEFAULT_LEN  10


class Number
{
public:
    Number();
    Number( std::string number, int iLen = DEFAULT_LEN );
    Number( const Number & Other );
    ~Number();
   
    Number operator +( const Number & Other );
    void vPrint();
   
private:
    int len;
    int * tab;
    void vSetNull();
    int iCharToInt( char c );
};

C/C++
#include "Number.h"
#include <iostream>


Number::Number()
{
    len = DEFAULT_LEN;
    tab = new int[ len ];
    vSetNull();
}

Number::Number( std::string number, int iLen )
{
    len = iLen;
    tab = new int[ len ];
    for( int i = 0; i < len; i++ )
    {
        int num = iCharToInt( number[ i ] );
        tab[ i ] = num;
    }
}

Number::Number( const Number & Other )
{
    if( this != & Other )
    {
        len = Other.len;
        tab = new int[ len ];
        for( int i = 0; i < len; i++ )
        {
            tab[ i ] = Other.tab[ i ];
        }
    }
}

Number::~Number()
{
    delete tab;
}

Number Number::operator +( const Number & Other )
{
    Number tmp;
    for( int i = 0; i < len; i++ )
    {
        tmp.tab[ i ] = tab[ i ] + Other.tab[ i ];
    }
    return Number( tmp );
}

void Number::vSetNull()
{
    for( int i = 0; i < len; i++ )
         tab[ i ] = 0;
   
}

int Number::iCharToInt( char c )
{
    switch( c )
    {
    case '0': return 0;
    case '1': return 1;
    case '2': return 2;
    case '3': return 3;
    case '4': return 4;
    case '5': return 5;
    case '6': return 6;
    case '7': return 7;
    case '8': return 8;
    case '9': return 9;
    default: return - 1;
    }
}
void Number::vPrint()
{
    std::cout << "\n\nWYNIK: ";
    for( int i = 0; i < len; i++ )
    {
        std::cout << tab[ i ] << ",";
    }
    std::cout << std::endl;
}

Metoda main

C/C++
#include "Number.h"


int main()
{
    Number a( "0123456789", 10 ), b( "0123456789", 10 );
    Number c;
    a.vPrint();
    b.vPrint();
   
    c = Number( a + b );
    c.vPrint();
   
    system( "pause" );
   
    return 0;
}

Problem: Wypisanie wartości a i b jest ok problem jest z wartością c wypisuje jasiek bzdury a na koniec wyskakuje błąd w destruktorze (chyba usuwam już usunięty wskaźnik "pi), z góry dziękuje za pomoc.
P-139699
pekfos
» 2015-11-06 16:36:39
Nie masz zaimplementowanego operatora przypisania.
P-139706
carlosmay
» 2015-11-06 17:14:59
Jak alokujesz pamięć na tablicę to zwalniasz też pamięć na tą tablicę
delete[] tab;
 
P-139708
j23
» 2015-11-06 18:40:22
Dodam tylko:
C/C++
int Number::iCharToInt( char c )
{
    switch( c )
    {
    case '0': return 0;
    case '1': return 1;
    case '2': return 2;
    case '3': return 3;
    case '4': return 4;
    case '5': return 5;
    case '6': return 6;
    case '7': return 7;
    case '8': return 8;
    case '9': return 9;
    default: return - 1;
    }
}
KISS
C/C++
int Number::iCharToInt( unsigned char c ) const
{
    return( c < 10 ) ? c - '0'
        : - 1;
}


Number::Number( std::string number, int iLen )
Po co dałeś parametr iLen, przecież std::string ma metodę size?
P-139712
« 1 »
  Strona 1 z 1