Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++ Конструкторы и деструкторы

83K
09 февраля 2014 года
Hellp
7 / / 08.12.2013
Нужна помощь, Задание было такое Составить описание класса для представления комплексных чисел. Обеспечить выполнение операций сложения, вычитания и умножения комплексных чисел.
Теперь нужно для класса задать конструктор (для выделения памяти) и деструктор(для освобождения памяти).

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Komplecs{
int a,b;
public:
 void Vvod();
 void Slog();
 void Umnog();
 void Vich();
};
void Komplecs::Vvod()
{
cout<<"Введите действительную часть числа";
cout<<endl;
cin>>a;
cout<<"Введите мнимую часть числа";cout<<endl;
cin>>b;
cout<<endl;cout<<"Число равно  ";
cout<< a<<"+i*"<< b;cout<<endl;
}
void Komplecs::Slog()
{int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа";cout<<endl;
cin>>z;
a=(t+x);
b=(d+z);
cout<<"Сумма равна";
cout<<endl;
cout<< a<<"+i*"<< b; cout<<endl;
}
void Komplecs::Umnog()
{
int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа"; cout<<endl;
cin>>z;
a=(t*x-d*z);
b=(t*z+d*x);
cout<<"При умножении число равно";cout<<endl;
cout<< a<<"+i*"<< b;cout<<endl;
}
void Komplecs::Vich()
{
int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа";cout<<endl;
cin>>z;
a=(t-x);
b=(d-z);
cout<<"При вычитании число равно";cout<<endl;
cout<< a<<"+i*"<< b;cout<<endl;
}
void main()
{
    setlocale (LC_ALL, "Russian");
    Komplecs c;int v;
v=1;
while(v!=0)
{
cout<<endl;
cout<<"1-Ввод числа";cout<<endl;
cout<<"2-Сложение чисел"; cout<<endl;
cout<<"3-Умножение чисел";cout<<endl;
cout<<"4-Вычитание чисел";cout<<endl;
cout<<"0-Выход";cout<<endl;
cin>>v;
if (v==1)
{
c.Vvod();
}
if (v==2)
{
c.Slog();
}
if (v==3)
{
c.Umnog();
}
if (v==4)
{
c.Vich();
}
} }
326
09 февраля 2014 года
sadovoya
757 / / 19.11.2005
У вас сильное тяготение к си. Ваш класс фактически просто библиотечка процедур, связанных лишь общей темой компексных чисел. Переписывать надо все с нуля. Для операций перегрузка операторов напрашивается. Посмотрите литературу, там этот пример любят.

P.S. То, что у вас сейчас получилось легко переделать в так-называемый класс-утилиту. Просто сделать все методы static и избавиться от a, b членов. Такая штука просто область видимости набора ф-ций ограничит классом. Обращение к ним будет classname::classfunction. Но, для таких вещей есть и другие решения. Но, вам-то "обычный" класс нужен (?), т.е. пользовательский тип со всеми атрибутами этого понятия.

Чтобы не пропадала работа, вот класс-утилита из вашего кода, может пригодится кому, если подобное зададут:

Код:
#include <iostream>

using namespace std;

class Komplecs {
public:
    static void Vvod();
    static void Slog();
    static void Umnog();
    static void Vich();
};
void Komplecs::Vvod() {
    int a, b;
    cout<<"Введите действительную часть числа";
    cout<<endl;
    cin>>a;
    cout<<"Введите мнимую часть числа";
    cout<<endl;
    cin>>b;
    cout<<endl;
    cout<<"Число равно  ";
    cout<< a<<"+i*"<< b;
    cout<<endl;
}
void Komplecs::Slog() {
    int t,d,x,z;
    cout<<"Введите действительную часть первого числа";
    cout<<endl;
    cin>>t;
    cout<<"Введите мнимую часть первого числа";
    cout<<endl;
    cin>>d;
    cout<<endl;
    cout<<"Введите действительную часть второго числа";
    cout<<endl;
    cin>>x;
    cout<<"Введите мнимую часть второго числа";
    cout<<endl;
    cin>>z;
    cout<<"Сумма равна";
    cout<<endl;
    cout<< t+x <<"+i*"<< d+z;
    cout<<endl;
}
void Komplecs::Umnog() {
    int t,d,x,z;
    cout<<"Введите действительную часть первого числа";
    cout<<endl;
    cin>>t;
    cout<<"Введите мнимую часть первого числа";
    cout<<endl;
    cin>>d;
    cout<<endl;
    cout<<"Введите действительную часть второго числа";
    cout<<endl;
    cin>>x;
    cout<<"Введите мнимую часть второго числа";
    cout<<endl;
    cin>>z;
    cout<<"При умножении число равно";
    cout<<endl;
    cout<< t*x-d*z <<"+i*"<< t*z+d*x;
    cout<<endl;
}
void Komplecs::Vich() {
    int t,d,x,z;
    cout<<"Введите действительную часть первого числа";
    cout<<endl;
    cin>>t;
    cout<<"Введите мнимую часть первого числа";
    cout<<endl;
    cin>>d;
    cout<<endl;
    cout<<"Введите действительную часть второго числа";
    cout<<endl;
    cin>>x;
    cout<<"Введите мнимую часть второго числа";
    cout<<endl;
    cin>>z;
    cout<<"При вычитании число равно";
    cout<<endl;
    cout<< t-x<<"+i*"<< d-z;
    cout<<endl;
}
int main() {
    setlocale (LC_ALL, "Russian");
    int v;
    v=1;
    while(v!=0) {
        cout<<endl;
        cout<<"1-Ввод числа";
        cout<<endl;
        cout<<"2-Сложение чисел";
        cout<<endl;
        cout<<"3-Умножение чисел";
        cout<<endl;
        cout<<"4-Вычитание чисел";
        cout<<endl;
        cout<<"0-Выход";
        cout<<endl;
        cin>>v;
        if (v==1) {
            Komplecs::Vvod();
        }
        if (v==2) {
            Komplecs::Slog();
        }
        if (v==3) {
            Komplecs::Umnog();
        }
        if (v==4) {
            Komplecs::Vich();
        }
    }
}
Повторяющиеся блоки кода желательно вынести в отдельную ф-цию.

Поясню про static. Такие методы являются собственностью всего класса, а не отдельных объектов, создаются в единственном экземпляре на весь класс. К ним можно обращаться без создания экземпляра класса (не нужен объект). Для класса-утилиты это лучше, чем обращение по objectname.function. Можно вообще запретить создание объекта, поместив конструктор в private-секцию.
326
10 февраля 2014 года
sadovoya
757 / / 19.11.2005
Вот начало, далее сами.


Код:
#include <iostream>
#include <sstream>

using namespace std;

class ComplexNumber {
    int x, y;//действ. и мним. части соответ.
public:
    ComplexNumber() : x(0), y(0) {} //нулевые значения re, im
    ComplexNumber(int a, int b) : x(a), y(b) {} //заданные значения re, im
    string toString(); //представление в виде строки
    ComplexNumber operator+(const ComplexNumber&);
};

string ComplexNumber::toString() {
    stringstream tmp;
    int im_z = y;
    const char *str = y<0? (im_z = -y, " - i*") : " + i*";
    tmp << x << str << im_z;
    return tmp.str();
}

ComplexNumber ComplexNumber::operator+ (const ComplexNumber& param) {
    ComplexNumber temp;
    temp.x = x + param.x;
    temp.y = y + param.y;
    return temp;
}

int main () {
    ComplexNumber z1(-3,1), z2(1,-2), z = z1 + z2, z3;
    cout << "z = " << z.toString() << endl;
    cout << "z3 = " << z3.toString() << endl; //z3 = 0 + i*0
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог