Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2009, 11:46   #31
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

перед функцией суммы я решил вывести значения на экран и убеился? что я их как-то криво задал, но непонятно, почему
A.otobr();B.otobr();C.otobr(); //для проверки задания значений. Видно что значения заданы неправильно
Dimarik вне форума Ответить с цитированием
Старый 30.06.2009, 11:53   #32
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Ошибок было полно. Все объяснять не буду (долго), сверь свой код и мой и посмотри в книге. Скажу только почему я использовал this. this это указатель. В данном случае он указывает не на копии переменные (формальные параметры) int dol,int euro, а именно на данные класса int dol,int euro. Это важно если у вас формальные переменные имеют одно название с данными класса.
profi вне форума Ответить с цитированием
Старый 30.06.2009, 12:45   #33
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

так, спасибо большое.. вроде более-менее понятно... но только вопрос. вот вы говорите "Это важно, когда формальные переменные имеют одно и то же название с данными класса" . так зачем this использовать? что просиходит (как думает машина), когда я не использую this и работаю с копиями переменных?
Dimarik вне форума Ответить с цитированием
Старый 30.06.2009, 12:54   #34
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
shet( int dol,int euro)
        {
          dol=dol; euro=euro; 
        }
Без this будет не понятно, что чему присваивать: формальные параметры данным класса, или на оборот.

Если хотите без указателя this тогда так

Код:
shet( int dollar,int evro)
        {
          dol=dollar; euro=evro; 
        }

Последний раз редактировалось profi; 30.06.2009 в 12:57.
profi вне форума Ответить с цитированием
Старый 30.06.2009, 14:56   #35
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

this - это указатель объекта класса на самого себя. Такой указатель есть у любого объекта любого класса.
MaTBeu вне форума Ответить с цитированием
Старый 30.06.2009, 15:46   #36
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Что бы лучше понять, что это такое предоставляю пример.

Код:
#include <iostream.h>
#include <conio.h>
class MyClass
{
public:
void Show();
};

void MyClass::Show()
{
cout << "My adress_1: " << this;
}

int main()
{
        MyClass obj;

        obj.Show();
        cout << "\nMy adress_2: " << &obj;

        getch();

        return 0;
}
Выводится два адресса, первый и второй адреса равны. Поясняю почему. Объект - это экземпляр класса. Объект содержит в себе методы класса и данные (свои копии). Когда мы вызываем эту функцию obj.Show(); вызывается функция, которая "содержится" в этом объекте и она показывает адрес данного объекта. В этой же строке
Код:
cout << "\nMy adress_2: " << &obj;
мы берем адрес объекта и выводим его на экран. Адрес берем с помощью амперсанда.

Последний раз редактировалось profi; 30.06.2009 в 15:48.
profi вне форума Ответить с цитированием
Старый 30.06.2009, 18:36   #37
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

вот сейчас с дружественными функциями написал прогу, но косячок есть. в Стивене Прате на стр 503 не было указано пространство имён. если я его не указываю, то у меня компиллятор указывает ошибку в операторе вывода , но если я его указываю, то выйдет ошибка в самом начала функции, на скобке. почему, если я не указываю принадлежность пространству имён, выскакивает ошибка в функции ??? и почему выскакивает ошибка, когда я указываю принадлежность? вот код:
Код:
#include <iostream.h>
class shet
{
private: int dol, euro;
public:
shet(int dol, int euro);
shet();
shet operator*(const shet &t) ;
friend ostream & operator<<(ostream &os, const shet &t);
};
shet sum(const shet &t);
otobr();
//далее идут прототипы функций, которые
//указаны в классе
        shet::shet( int dol,int euro)
        {
          this->dol=dol, this->euro=euro; //зачем такое присвоение?
        };
        shet::shet( )
        {
          dol=0, euro=0; //задаю по умолчанию значения
        };
        shet shet::operator*(const shet &t)
        {
        shet m;
        m.dol=dol*t.dol;
        m.euro=euro*t.euro;
        return m;
        };
        ostream &  shet::operator<<(ostream &os, const shet &t) //почему нельзя написать
        //ostream &  shet::operator<<(ostream &os, const shet &t)??
        {
        os<<shet::dol<<"   dollarov   "<<shet::euro<<"   euro"<<endl; return os;
        }

main()
{
shet A(5,6), B(10,11), C;    //придаём А и B значения A.dol=5, A.euro=6; для B аналогично

C=B*A;
cout<<C;
system("pause");
}
Dimarik вне форума Ответить с цитированием
Старый 30.06.2009, 18:48   #38
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
ostream &  shet::operator<<(ostream &os, const shet &t)
выделенное не нужно.

Код:
 os<<shet::dol<<"   dollarov   "<<shet::euro<<"   euro"<<endl; return os;
а тут надо так:
Код:
os<<t.dol<<"   dollarov   "<<t.euro<<"   euro"<<endl; return os;
У вас operator<< - друг, а не функция-член класса.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.06.2009, 19:04   #39
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

так .. получается для друга не требуется shet::, так как компилятор и без него понимает, какому пространству имён принадлежит эта функция, так? а это shet::euro невозможно, так как оператор не член класса, так? я всё правильно понял?
Dimarik вне форума Ответить с цитированием
Старый 30.06.2009, 19:11   #40
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
так .. получается для друга не требуется shet::, так как компилятор и без него понимает, какому пространству имён принадлежит эта функция, так?
Повторю: operator<< - не член класса, а просто друг. Он не принадлежит shet. Поэтому и писать shet:: не нужно.
Цитата:
а это shet::euro невозможно, так как оператор не член класса, так?
Да.
К тому же, даже если логически подумать, зачем тогда функция принимает const shet &t, если не будет им пользоваться?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На счёт окошек Акашаев Нурлан Общие вопросы Delphi 2 26.06.2008 09:52
Как на счёт создания игрового 2D или 3D движка на C++? SalasAndriy Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 23.12.2007 23:05
«Окно+символ». Создать класс, представляющий окно в текстовом режиме. RustreX Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2007 19:28
Помогите мне пожалуйста!На счёт книг! SADAM Свободное общение 1 08.06.2007 14:26