Форум программистов, компьютерный форум CyberForum.ru

Указатели на объект - C++

Восстановить пароль Регистрация
 
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
18.03.2014, 13:13     Указатели на объект #1
Здравствуйте, подскажите пожалуйста вот по какому вопросу...
Начали изучать классы в С++, и сначала была задача ввода дроби, ее сокращению и выводу в общепринятом виде, теперь задача в том чтобы ввести несколько дробей и написать в классе функции которые будут делить и перемножать дроби. Теперь собственно сам мой вопрос: как правильно использовать указатели в этом случае? Чтобы просто прописать функцию.. В этой задаче много "воды", она у меня переделана, но если вы мне объясните принцип (прошу вас не писать мне весь листинг, хочу сам научиться работать) по которому это работает...допустим как сложить два числителя, ну или просто как сослаться к числителю первой дроби и второй, в чем отличие и сходство обращения? В листинге кстати ввод одной дроби
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream.h>
 
class Drob
{ private: int a,b,d,e,i,k;
  public: void Set_Drob ()
          { cout<<"Vvedite chislitel` "; cin>>a; cout<<"Vvedite znamenatel` "; cin>>b;
            cout<<"Drob` "<<endl<<a<<endl<<"-"<<endl<<b<<endl;
          }
          void sokrat ()
  { for(i=2,k=0;i<=a;i++) if (b%i==0&&a%i==0){d=a/i; e=b/i;k++; cout<<endl;}}
   int kak()
   {if(k>0) cout<<"Drob` sokratima"<<endl<<d<<endl<<"-"<<endl<<e<<endl;
    else cout<<"Drob` ne sokratima"<<endl;}
};
int main()
{
    Drob First;
    First.Set_Drob();
    First.sokrat();
    First.kak();
    system("Pause");
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 13:13     Указатели на объект
Посмотрите здесь:

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
Указатели на объект C++
компилятор считает объект l-value, но объект таковым не является C++
Конструкторы и указатели на объект класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
18.03.2014, 13:37     Указатели на объект #2
Во-первых, назовите в классе поля числителя и знаменателя нормальными названиями
дробь - fraction
числитель - numerator
знаменатель - denominator
Тогда хоть станет ясно, где у вас что.

Во-вторых, я так понимаю, подразумевается переопределить операторы умножения и деления для дроби.
C++
1
2
Fraction operator*(const Fraction & F1, const Fraction & F2);
Fraction operator/(const Fraction & F1, const Fraction & F2);
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
18.03.2014, 13:52  [ТС]     Указатели на объект #3
John Prick, когда пишешь программу на таком уровне владения информацией, когда часто используешь переменные , то мне гораздо удобнее использовать переменные а и b, это не принципиально, если людям удобней будет помогать мне так, переименую))
Суть задания в том чтобы прописать универсальную функцию в описании класса, для сколь угодно дробей, и чтобы в теле можно было вызвать ее сколь угодно раз, и она перемножит и поделит столько раз сколько нжно пользователю... я вот этого не понимаю, преподаватель единственное что сказал то это то что вызов нужно сделать через точку...весьма информативно)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream.h>
 
class Fraction
{ private: int numerator, denominator;
  public: void Set_Fraction()
          { cout<<"Vvedite chislitel` "; cin>>numerator; cout<<"Vvedite znamenatel` "; cin>>denominator;
            cout<<"Drob` "<<endl<<numerator<<endl<<"-"<<endl<<denominator<<endl;
          }
          int d,e,i,k;
          void sokrat ()
  { for(i=2,k=0;i<=numerator;i++) if (denominator%i==0&&numerator%i==0){d=numerator/i; e=denominator/i;k++; cout<<endl;}}
   int kak()
   {if(k>0) cout<<"Drob` sokratima"<<endl<<d<<endl<<"-"<<endl<<e<<endl;
    else cout<<"Drob` ne sokratima"<<endl;}
};
int main()
{
    Fraction First;
    First.Set_Fraction();
    First.sokrat();
    First.kak();
    system("Pause");
    return 0;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
18.03.2014, 13:59     Указатели на объект #4
Ну в таком случае можно написать что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
class Fraction
{
public:
    Fraction Multiply(const Fraction & F)
    {
        Fraction result;
        // тут перемножаем по правилам
        return result;
    }
};
Тогда в коде можно будет вызывать, например так:
C++
1
2
3
Fraction f1, f2, f3, f4;
f4 = f1.Multiply(f2);
Fraction f5 = f1.Multiply(f2.Multiply(f3.Multyply(f4)));
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
24.03.2014, 14:24  [ТС]     Указатели на объект #5
Здравствуйте, тема для меня еще не закрыта, не могу разобраться в этом... подскажите пожалуйста как реализовать? дроби вводится у меня уже 2.. двумя различными конструкторами, по умолчанию и с параметром.. сейчас программа проверяет сокращаются ли 2 дроби и выводит их. нужно написать функцию умножения и деления дробей... еще узнал что эта функция должна быть прописана в наследуемом разделе...
в моей программе а - числитель, b - знаменатель, с и d так же числитель и знаменатель но для сокращаемой дроби... как вспомогательные переменные...класс - Drob
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream.h>
 
class Drob
{ protected: int a,b;
  public: Drob(){cout<<"Vvedite drob` "<<endl;cin>>a>>b;}
          Drob(int x, int y){a=x; b=y;} 
          
   void Print()
   {cout<<"Drob` "<<endl<<a<<endl<<"-"<<endl<<b<<endl;}
               void sokrat ()
 { int i,d,e,k; for(i=2,k=0;i<=a;i++) if (b%i==0&&a%i==0) {d=a/i;e=b/i;k++;cout<<endl;}
              
             if(k>0) cout<< "Drob` sokratima"<< endl<<d<<endl<<"-"<<endl<<e<<endl;
 else cout<< "Drob` ne sokratima"<<endl;}
                        
};
 
int main()
{
    
    Drob First,A(3,5);
    A.Print();
    A.sokrat();
    First.Print();
    First.sokrat();
    system("Pause");
    return 0;
}
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.03.2014, 14:47     Указатели на объект #6
Цитата Сообщение от Warzone-blg Посмотреть сообщение
нужно написать функцию умножения и деления дробей... еще узнал что эта функция должна быть прописана в наследуемом разделе...
про умножение и деление было раньше написано, а насчет "наследуемого раздела" создать класс наследник и в нем определить эти методы? или что...
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
24.03.2014, 14:49  [ТС]     Указатели на объект #7
aLarman, Да, создать наследуемый класс, в моем случае если не ошибаюсь это будет выглядеть как
C++ (Qt)
1
2
3
 class Nasledie:public Drob
 {
 public:
и вот в паблик прописать функцию или как вы сказали метод который будет умножать дроби или делить их, то есть чтобы нам осталось только вызвать эту функцию в теле
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.03.2014, 14:51     Указатели на объект #8
а как Вы хотите? что бы можно было писать так - drob1/drob2 ? или так drob1.Razdelit(drob2)?
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
24.03.2014, 15:01  [ТС]     Указатели на объект #9
aLarman, мне кажется у меня не получится, да? ведь числитель и знаменатель у меня по факту не связаны, дробь выводится просто через cout и дефис, но вообще если вызывать функцию то это второй вариант drob1.Razdelit(drob2)

Добавлено через 7 минут
уже все равно как это будет реализовано... сдача на днях...а сам я разобраться не смог
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.03.2014, 15:23     Указатели на объект #10
можно перегрузить оператор /
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Nasledie:public Drob
 {
 public:
Nasledie():Drob()
{}
Nasledie(int x, int y): Drob(x,y)
{}
const Nasledie operator/(const Nasledie & r)
{
int g,k;
g = a*r.b;
k = b*r.a;
return Nasledie(g,k);
}
};
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
const Nasledie Razdelit(const Nasledie & r)
{
int g,k;
g = a*r.b;
k = b*r.a;
return Nasledie(g,k);
}
или вот такой метод, в 1ом случае Вызываем
C++
1
2
Nasledie Drob1,Drob2;
Nasledie Drob3 = Drob1/Drob2;
во втором случае
C++
1
Nasledie Drob3 = Drob1.Razdelit(Drob2);
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
25.03.2014, 13:10  [ТС]     Указатели на объект #11
aLarman, а в каком месте объявить или как вызвать drob1 drob2 они ведь не объявлены..

Добавлено через 3 минуты
В чем тут дело подскажите... как заставить это работать? С того момента как создал наследуемый класс и нужно разделить одну дробь на другую... ну или умножить...не важно...
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream.h>
 
class Drob
{ protected: int a,b;
  public: Drob(){cout<<"Vvedite drob` "<<endl;cin>>a>>b;}
          Drob(int x, int y){a=x; b=y;} 
          
   void Print()
   {cout<<"Drob` "<<endl<<a<<endl<<"-"<<endl<<b<<endl;}
               void sokrat ()
 { int i,d,e,k; for(i=2,k=0;i<=a;i++) if (b%i==0&&a%i==0) {d=a/i;e=b/i;k++;cout<<endl;}
              
             if(k>0) cout<< "Drob` sokratima"<< endl<<d<<endl<<"-"<<endl<<e<<endl;
 else cout<< "Drob` ne sokratima"<<endl;}
                        
};
class Nasledie:public Drob
 {
 public:
Nasledie():Drob()
{}
Nasledie(int x, int y): Drob(x,y)
{}
const Nasledie Razdelit(const Nasledie & r)
{
int g,k;
g = a*r.b;
k = b*r.a;
return Nasledie(g,k);}
};
int main()
{
    
    Drob First,A(3,5);
    A.Print();
    A.sokrat();
    First.Print();
    First.sokrat();
    Nasledie Drob3 = A.Razdelit(First);
    system("Pause");
    return 0;
}
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 13:13     Указатели на объект #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    
    Nasledie First,A(3,5);
    A.Print();
    A.sokrat();
    First.Print();
    First.sokrat();
    Nasledie Drob3 = A.Razdelit(First);
    Drob3.Print();
    system("Pause");
    return 0;
}
Warzone-blg
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 60
25.03.2014, 13:26  [ТС]     Указатели на объект #13
aLarman, Вы словно бог С++ ))) Большое спасибо)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 13:43     Указатели на объект #14
Warzone-blg,
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2014, 13:47     Указатели на объект
Еще ссылки по теме:

C++ Потоки и указатели (в поток вставить объект класса)
Может ли объект-член, или объект-элемент достучаться к содержащему его? C++
C++ Создать объект стек и создать объект очередь с перегруженными операциями

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.03.2014, 13:47     Указатели на объект #15
Цитата Сообщение от aLarman Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
Nasledie First,A(3,5);
* * A.Print();
* * A.sokrat();
* * First.Print();
* * First.sokrat();
* * Nasledie Drob3 = A.Razdelit(First);
* * Drob3.Print();
* * system("Pause");
* * return 0;
}
А где здесь указатель?
Yandex
Объявления
25.03.2014, 13:47     Указатели на объект
Ответ Создать тему
Опции темы

Текущее время: 05:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru