2013-03-31 3 views
0

Итак, у меня есть класс под названием HugeInt, который хранит динамический массив целых чисел с каждым местом, соответствующим десятичному месту (arr [0] = 2^0, arr [1] = 2^1 ...). Поэтому у меня также есть этот метод reverse, который меняет числа. Но в основном это дает два разных результата, может ли кто-нибудь помочь? DynArray - это динамический класс массива, который я создал. Он просто содержит массив int, который изменяется на основе, если мы добавляем к массиву. (Невозможно использовать векторы)Почему этот метод дает два разных результата?

HugeInt HugeInt::reverse(){ 
    HugeInt hi; 
    for (int i = 0; i < this->size; i++){ 
     hi.dyn.add(this->dyn[this->size - 1 - i]); 
    } 
    return hi; 
} 

Мои функции печати:

void HugeInt::print(){ 
    dyn.print(); 
} 

void DynArray::print(){ 
    for (int i = 0; i < nextIndex; i++){ 
     std::cout << arr[i]; 
    } 
} 

мой оператор =:

HugeInt& HugeInt::operator=(const HugeInt &b1) 
{ 
    this->dyn = b1.dyn; 
    this->size = b1.size; 
    return *this; 
} 

Когда я запускаю это:

int main(int argc, char *argv[]) 
{ 
    HugeInt hi4("123456"); 

    hi4.print(); 
    cout << endl; 
    cout << endl; 
    hi4.reverse().print(); 
    cout << endl; 
    cout << endl; 
    hugeInt = hi4.reverse(); 
    hugeInt.print(); 
} 

я получаю эти результаты :

 
123456 

654321 

3854321 

Почему последний результат отличается от второго результата? Я не привык к кодированию в C++, поэтому я чувствую, что это может быть какая-то C++ вещь, которую я пропускаю?

ОБНОВЛЕНИЕ: ОК, поэтому я полностью потерян сейчас. Я изменил свой обратный(), чтобы:

HugeInt HugeInt::reverse() 
{ 
    return *this; 
} 

и мой главный как:

int main(int argc, char *argv[]) 
{ 
    HugeInt hi4("123456"); 

    hi4.reverse().print(); 
    cout << endl; 
    cout << endl; 
    hugeInt = hi4.reverse(); 
    hugeInt.print(); 
} 

и получить результаты

 
123456 

3223456 

32 на таблице ASCII является 'Space' и 38 &, о чем он говорил раньше. Я так потерян!

+5

Что происходит, когда вы удаляете 'this-> ~ HugeInt();'? (Кстати, вы почти никогда не должны называть деструктор вручную) –

+0

Проблемы с конструкторами копирования и др.? Я не вижу ни одного –

+0

Как сказал @JesseGood, почему вы его уничтожаете? – vidit

ответ

3

Эта строка в HugeInt HugeInt::reverse() является .

this->~HugeInt(); 

Это означает, что первый раз, когда вы звоните hi4.reverse(), вы разрушаете hi4.

Каждый раз, когда он используется, это неопределенное поведение.

Удалите эту линию. Я не могу понять, что вы надеялись сделать там, но «ничего», вероятно, лучше сделать там.

+0

Gotcha. Я буду помнить, что для будущей ссылки я до сих пор не знаком с C++ – sanghas26

0

Я попытался реализовать вашу проблему. Мне пришлось немного импровизировать на этих классах, но этот код работает безупречно с MS VS 2010.

Моя программа:

//file: header.h 
//author: kupto 
#pragma once 
#include <iostream> 
#include <stdio.h> 
#include <vector> 

class DynArray 
{ 
    std::vector<char> arr; 

public: 
    void print(); 
    void add(char c) {arr.push_back(c);}; 
    char get(int pos) {return (arr[pos]);}; 
    int size() {return arr.size();}; 
}; 

void DynArray::print() 
{ 
    for (int i = 0; i < this->size(); i++) 
     std::cout << arr[i]; 
    std::cout << std::endl; 
} 

class HugeInt 
{ 
    DynArray dyn; 

public: 
    void print() {dyn.print();} 
    int size() {return (dyn.size());} 

    HugeInt HugeInt::reverse(); 

    HugeInt(char* str); 
    HugeInt() {}; 

}; 

HugeInt::HugeInt(char* str) 
{ 
    char c; 
    int i = 0; 
    c = str[i]; 

    while (c) 
    { 
     dyn.add(c); 
     c = str[++i]; 
    } 
} 

HugeInt HugeInt::reverse() 
{ 
    HugeInt hi; 
    for (int i = 0; i < this->size(); i++){ 
     hi.dyn.add(this->dyn.get(this->size() - 1 - i)); 
    } 
    return hi; 
} 

и исходный файл:

//file: source.cpp 
//author: Kupto 
#include "header.h" 

using namespace std; 

int main() 
{ 
    HugeInt hi4("123456"); 

    hi4.print(); 
    hi4.reverse().print(); 
    HugeInt hugeInt = hi4.reverse(); 
    hugeInt.print(); 
    hi4 = hugeInt; 
    hi4.print(); 
    hi4 = hi4.reverse(); 
    hi4.print(); 
    return 0x00; 
} 

Выход, как и ожидалось:

123456 
654321 
654321 
654321 
123456 

Обратите внимание, что я использовал DynArray::get(int) метод вместо вашего operator[int]. Удачи вам в вашем коде.

+0

Хм, я использую QT Creator, я чувствую, что он должен работать, но, возможно, это связано с IDE, которую я использую? – sanghas26

+0

Может быть и так ... У меня нет опыта работы с QT Creator. Вы можете рассмотреть возможность размещения вашего обрезанного кода (обрезать его до тех пор, пока вы можете произвести эту ошибку), возможно, мы могли бы взглянуть на него. – Kupto