Класс "комплексные числа"

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Комплексное число - это (a+b*i), где i - корень из -1.
Класс я написал, но без учета этого i.
Вот его реализация:

Код: Выделить всё

class Complex
{
    public:
       Complex(double the_real, double the_imaginary);
    
       Complex(double real_part);
    
       Complex();
    
       friend bool operator ==(const Complex& first, const Complex& second);
    
       friend Complex operator +(const Complex& first, const Complex& second);
    
       friend Complex operator -(const Complex& first, const Complex& second);
    
       friend Complex operator *(const Complex& first, const Complex& second);
    
       friend istream& operator >>(istream& ins, Complex& number);
     
       friend ostream& operator <<(ostream& outs, const Complex& number);
    
    private:
       double real;
       double imagine;
};

Complex::Complex(double the_real, double the_imaginary): real(the_real), imagine(the_imaginary)
{
    //Тело намеренно оставлено пустым
}

Complex::Complex(double real_part): real(real_part), imagine(0)
{
    //Тело намеренно оставлено пустым
}

Complex::Complex(): real(0), imagine(0)
{
    //Тело намерено отсавлено пустым
}

bool operator ==(const Complex& first, const Complex& second)
{
    return((first.real == second.real) && (first.imagine == second.imagine));
}

Complex operator +(const Complex& first, const Complex& second)
{
    Complex temp;
    temp.real = first.real + second.real;
    temp.imagine = first.imagine + second.imagine;

    return temp;
}

Complex operator -(const Complex& first, const Complex& second)
{
    Complex temp;
    temp.real = first.real - second.real;
    temp.imagine = first.imagine - second.imagine;

    return temp;
}

Complex operator *(const Complex& first, const Complex& second)
{
    Complex temp;
    temp.real = (first.real * second.real) - (first.imagine * second.imagine);
    temp.imagine = (first.real * second.imagine) + (first.imagine * second.real);

    return temp;
}

istream& operator >>(istream& ins, Complex& number)
{
    //Формат ввода значений: (1, 2)
    char ch1, ch2, ch3;
    ins >> ch1;
    ins >> number.real;
    ins >> ch2;
    ins >> number.imagine;
    ins >> ch3;

    if(ch1 != '(' || ch2 != ',' || ch3 != ')')
    {
        cout << "Illegal complex number format.\n";
        exit(1);
    }

    return ins;
}

ostream& operator <<(ostream& outs, const Complex& number)
{
    outs << '(';
    outs << number.real;
    outs << ',';
    outs << number.imagine;
    outs << ')';

    return outs;
}
Но в задании есть пометка:
i — число, представляющее значение корень из -1.
Переменная-член imaginary соответствует числу, умножаемому на i.
Константу i определите так:
const Complex i(0, 1);
Это и будет описанное выше значение i.
Константу допустим объявил. Тогда, если комплексное число следующее: (1, 2), то 2 еще должно обрабатываться, как 2*i, т.е. 2(0, 1). Или я что-то не так понимаю? Как в указанный класс примостить эту константу и ее использовать в соответствии с представлением (a+b*i)?

Заранее спасибо.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

В классе и не должно быть этого i. Убери friend из описания класса.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Тогда никаких изменений не надо.
Глупый вопрос, но все-же почему убрать friend из описания?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Dragon, Константа i - это будет экземпляр [константный, т.е. не изменяемый] класса Complex.
Т.е., например так:

Код: Выделить всё

const Complex I_COMPLEX (0, 1);
Что с ней дальше делать (и надо ли вообще что-то делать) - неясно.

А число (1, 2) действительно можно представить как :

(1, 2) = (1, 0) + (0, 2) = (1, 0) + 2 * (0, 1) = (1, 0) + 2 * I_COMPLEX
Dragon писал(а):Глупый вопрос, но все-же почему убрать friend из описания?
Из описания операторов friend убирать НЕ надо. Если уберешь, ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

BBB
Спасибо. Все-таки загнало в тупик это i. Наверное это больше как информация для размышления было дано :)
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

BBB писал(а): Из описания операторов friend убирать НЕ надо. Если уберешь, ты в реализации этих операторов не сможешь доступиться к private-полям класса (real и imagine).
Не неси полную ахинею. А что по твоему такое "инкапсуляция". В реализации он и так доберётся до членов private: внутри класса есть доступ ко всем членам. А вот на счёт видимости операторов вне класса не знаю.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Airhand писал(а):Не неси полную ахинею. А что по твоему такое "инкапсуляция". В реализации он и так доберётся до членов private: внутри класса есть доступ ко всем членам. А вот на счёт видимости операторов вне класса не знаю.
Инкапсуляция инкапсуляции рознь.
Аксессоров у меня в классе нету (в данном случае перегрузка оператора удобнее), то ради интереса убрал friend, как вы посоветовали.

Код: Выделить всё

Complex operator +(const Complex& first, const Complex& second);

Complex Complex: :o perator +(const Complex& first, const Complex& second)
{
    Complex temp;
    temp.real = first.real + second.real;
    temp.imagine = first.imagine + second.imagine;

    return temp;
}
Компилятор всбесился сразу:
|54|error: `Complex Complex: :o perator+(const Complex&, const Complex&)' must take either zero or one argument|
In function `int main()':|
|93|error: no match for 'operator+' in 'numb1 + numb2'|
|54|note: candidates are: Complex Complex: :o perator+(const Complex&, const Complex&)|
|130|error: `Complex Complex: :o perator+(const Complex&, const Complex&)' must take either zero or one argument|
||=== Build finished: 3 errors, 0 warnings ===|
Собственно воть.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Airhand, ты как обычно "где-то слышал звон".
Перегрузку бинарных операторов для класса можно релизовывать либо с помошью функций-членов класса (в этом случае параметр у ф-ии-оператора будет ОДИН), либо функйции-НЕЧЛЕНА класса (в этом случае ф-ии будет ДВА параметра).
Из кода Dragon-а видно, что у него используется второй вариант. Т.е. (еще раз) его ф-ии, перегружающие бинарные операторы не являются членами класса и без объявления их friend-ами не будут иметь доступ к private-полям класса.

--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Dragon, у Airhand-а, как показывает практика, очень своеобразное видение языка C [и C++] :) )
Так что воспринимай его советы и теоретические рассуждения аккуратно и с некоторой поправкой.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

BBB писал(а):Airhand, ты как обычно "где-то слышал звон".
Перегрузку бинарных операторов для класса можно релизовывать либо с помошью функций-членов класса (в этом случае параметр у ф-ии-оператора будет ОДИН), либо функйции-НЕЧЛЕНА класса (в этом случае ф-ии будет ДВА параметра).
Из кода Dragon-а видно, что у него используется второй вариант. Т.е. (еще раз) его ф-ии, перегружающие бинарные операторы не являются членами класса и без объявления их friend-ами не будут иметь доступ к private-полям класса.
Это ты где-то слышал звон, да не знаешь где он. В его примере ошибки вылазят потаму, что операторы просто "невидят" private членов, т.к. сами операторы перегружают внешние для типа Complex.

Dragon
Не называй меня на "вы".
Если не хочешь изваращаться, то оставь friend.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вот это предложение (а именно то, что идет после "т.к."), пожалуйста, растолкуй поподробнее:
Airhand писал(а):...операторы просто "невидят" private членов, т.к. сами операторы перегружают внешние для типа Complex.
Прочитал его несколько раз, но так и не понял, о чем в нем говорится.
Ответить