Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель this 
:(
    Опции темы
murzzzzz
Дата 14.2.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



чо это вообще за указатель такой this? им кто-нить юзает? тогда с какой целью?
PM MAIL ICQ   Вверх
setq
Дата 14.2.2005, 12:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код
this
используется, для обращения к экземпляру класса из функции, определённой в этом классе.
Код
class A { public:
  int x;
  void f () { }
} m, n;
m и n будут иметь каждый свою копию переменной x. а вот функция f будет у них общая (так уж получается). чтобы f могла отличить m от n ей при вызове
Код
m . f ();
неявно передаётся указатель на m. функция может обратиться к нему по имени this. например так:
Код
#include <iostream.h>

class A { public:
  int x;
  void f () {
     cout << "адрес в памяти того экземпляра,"
                  " который меня вызвал: " << this << "\n";
  }
} m, n;
для чего это бывает надо? ну, как... зависит от фантазии. например определим функцию f класса A как
Код
#include <iostream.h>

class A { public:
  int x;
  A& f () {
     cout << "привет\n";
     return *this;
  }
} m, n;
теперь в программу вставим
Код
m.f ().f ().f ().f ();  // четыре раза привет :)
впрочем есть случаи когда можно спокойно обойтись и без this.
Код
#include <iostream.h>

class A { public:
  int x;
  void f () {
     cout << "моя переменная x = "  <<  this->x    << "\n";
     cout << "но можно написать и так = " <<  x << "\n";
  }
} m, n;
надеюсь я ничего не напутал в примерах. почти не пишу на c++

а вообще, не обижайся, советую почитать чего-нибудь. в с++ много интересного %)

Это сообщение отредактировал(а) setq - 14.2.2005, 12:36
  Вверх
murzzzzz
Дата 14.2.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



читала ,токо в книге в книге как в Библии, сильно замысловато:)), поэтому и спрашую.
а почему в коде
Код

#include <iostream.h>
class A { public:
  int x;
  A& f () {
     cout << "привет\n";
     return *this;
  }
} m, n;

када Вы функцию определяли, не написали какого она типа? или када используется
Код

A& f ()
{... }

не надо тип? это ж типа ссылка?
PM MAIL ICQ   Вверх
_hunter
Дата 14.2.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



это и есть тип smile -- ссылка


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
murzzzzz
Дата 14.2.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



ага!!!!! поняла!!! smile
токо этот this мне все равно не нравится smile так все-таки, программеры!ответте мне плизззз!Вы юзаете этим указателем или нет?без него можна обойтись, не теряя при этом компактности, читабельности и всего того, чем должна быть обеспечена моднявая прога? smile
PM MAIL ICQ   Вверх
Wowa
Дата 14.2.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



не знаю, как this*, но сам this - конечно очень нужен.
PM WWW   Вверх
_hunter
Дата 14.2.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



самый простой и понятный пример:
у тебя членом класса является поле id и в конструктор тебе передается переменная с именем id
вот чтобы полю класса присвоить переданную переменную пишут this->id = id;


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Wowa
Дата 14.2.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



а когда все-таки нужен this* ?
Это ведь не обыкновенный указатель, а тут ключевое словое this используется, которой символизирует сам класс.
Или это также действует? пример?

Код

class a {
public:
id;

// Конструктор
a (id) {
this->id=id;
this* bb; //bb является указателем (пока еще в никуда) этого класса.
*bb=&id;

//Будут ли выведены на экран два одинаковых числа?
cout <<this->id<<;
cc=*bb;
cout <<*cc<<;

}

}

void main() {
id=3;
a aa = id; //Передаем конструктору id

return 0;
}

Добавлено @ 18:27
_hunter можешь исправить ошибки в моем коде?
PM WWW   Вверх
_hunter
Дата 14.2.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



примерно так ( не вводя доп. операторов ( и если правильно понял идею ) ):

Код

class a
{
public:
   int id;
   a (int id)
   {
       this->id=id;
       a* bb;
       bb = this;
       bb->id = id;

       std::cout <<this->id;
       std::cout <<bb->id;
   }
};

int main(int argc, char* argv[])
{
   int id=3;
   a aa(id);
}


а *this нужен для сцепки ( как уже было показанно выше )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
pablo
Дата 14.2.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Указатель this очень часто используется для перегрузки операторов,
а именно там где нужна конкатенация.
Например оператор +.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
bel_nikita
Дата 14.2.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Еще вот, такое использование this:
Код

class cExample
{
public:
 cExample(){};
 ~cExample(){};
 void SomeFunction(unsigned value)
 {
   if (!this) return; // если объект не создан выходим
   printf("\nSomeFunction =%d",value);
 }

protected:
private:
};

Код

cExample* pExample = NULL;

pExample->SomeFunction(0); // прога не вылетает;) и метод не вызывается :))

pExample = new cExample(); // создали объект
pExample->SomeFunction(1); // а теперь метод вызывается
delete pExample;



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Adil'
Дата 15.2.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата(_hunter @ 14.2.2005, 18:39)
  a (int id)
  {
      this->id=id;
Обычно, чтобы не возникало путаницы, стараются в методе класса не давать параметрам имена, совпадающие с именами членов smile
Цитата(bel_nikita @ 14.2.2005, 21:44)
cExample* pExample = NULL;
  pExample->SomeFunction(0); // прога не вылетает;) и метод не вызывается smile)
  ...
метод все-таки вызывается, просто возврат из него происходит по if(!this) smile
З.Ы. Без проверки твой пример все равно будет работать smile
Цитата(bel_nikita @ 14.2.2005, 21:44)
...
  void SomeFunction(unsigned value)
{
  printf("\nSomeFunction =%d",value);
}
  ...
- в нем же нет обращения к this. Вот так наглядней:
Код
class cExample
{
public:
cExample(){};
~cExample(){};
void SomeFunction(unsigned value)
{
  if (!this) return; // если объект не создан выходим
  data=value;
  printf("\nSomeFunction =%d",data);
}

protected:
int data;
private:
};




--------------------
Удачи
PM MAIL WWW   Вверх
Да гость я...
Дата 16.2.2005, 09:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Э-э-эх ребя...
Хрен бы кто из вас у меня техническое интервью прошел.

Попросил бы вас написать оператор присваивания для к-нибудь простенького класса. Как вы его без this нарисуете?
Код

class A
{
   int n;
public:
// assignment operator
A& operator=(const A& rA)
{
   if(this != &rA)
       n = rA.n;

   return *this;
}

A& operator+(const A& rA)
{
   n += rA.n;

   return *this;
}
};


Зачем в опреаторе присвоения this спросите? Да чтобы объект сам в себя не копировать.
А зачем перегруженные операторы часто *this возвращают? Чтобы выражения с объектами можно было записывать в таком же виде, как и со встроенными типами. Например,

Код

int nB= xxx, nC= xx, nD= xxxx; // etc
int nA= nB + nC - nD + 10;

A cB, cC, cD; // предположим, что все объекты инициализированы

A cA= cB - cC + cD; // предположим, что все требуемые операторы для класса A определены


Ну, и наконец, signature любой ф-ции члена класса содержит this первым аргументом. Это единственный способ сообщить ей данные какого объекта она в настоящий момент должна обработать. Точка входа-то в код ф-ции-член класса одна, а объектов - куча. А иначе каким таким образом ф-ция знает, для данных какого объекта её вызвали? Без понимания этого обстоятельства у людей объектный код ф-ций-членов размножаться начинает...
  Вверх
Да гость я...
Дата 16.2.2005, 09:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Ну, и наконец, signature любой ф-ции члена класса содержит this первым аргументом

Сорри, неточность в формулировке: любой НЕСТАТИЧЕСКОЙ ф-ции члена класса. Статические методы this не получают. Именно поэтому они в состоянии доступиться только до статических же атрибутов.
Ну покедова...
  Вверх
Adil'
Дата 16.2.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата
Э-э-эх ребя...
Хрен бы кто из вас у меня техническое интервью прошел.

Попросил бы вас написать оператор присваивания для к-нибудь простенького класса. Как вы его без this нарисуете?
Ты б и обычное у меня не прошел, бо как даже все мессаги прочесть поленился :
Цитата(pablo @ 14.2.2005, 19:09)
Указатель this очень часто используется для перегрузки операторов,
а именно там где нужна конкатенация.
Например оператор +.

Тоже мне, самый умный...


--------------------
Удачи
PM MAIL WWW   Вверх
comcon1
Дата 1.8.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Поднимаю тему.
Я передаю функции указатель this (на класс Interface, содержащий контайнер hyperarray типа WVector). Так:
Код

data_blck << lex::data_strings(this) << lex::endblock;

Внутри функции пытаюсь получить значение итератора (на самом деле там еще углубление в несколько функций, но везде передается указатель).
Код

data_strings(Interface *at) {
___WVector::iterator rt = int__->hyperarray.begin();
}

Вылетает SEGMENTATION FAULT.
Делаю так. Все работает:
Код

Interface *at = this;
data_blck << lex::data_strings(this) << lex::endblock;
....
....
data_strings(Interface *&at) {
___WVector::iterator rt = int__->hyperarray.begin();
}

Что за шаманизм?? Подробно дать код не могу -- большой. Я не выцплю нужного наглядного места.
Но вот мой вопрос. Какими особыми свойствами обладает этот указатель this, что так происходит???


--------------------
PM MAIL   Вверх
CoreDumped
Дата 2.8.2005, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.8.2005

Репутация: нет
Всего: 1



Может быть глюки компилятора
PM MAIL   Вверх
Earnest
Дата 2.8.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Хм...
А почему у функции data_strings не описано возвращаемое значение?
Еще в первом варианте аргумент "Interface *at", а во втором "Interface *&at". Это описка или действительно есть такая разница... и кто такой int__. Непонятно, зачем Interface* передается в data_strings, если вроде не используется.
Еще имя "интерфейс" наводит на интересные размышления. У тебя там точно никто ссылки не считает?

В общем, недостаточно данных. this никакими особым свойствами не обладает, кроме того, что он const (в смысле, нельзя написать this = xxx).
Ничего такого в приведенном коде нет - значит, собака зарыта в том коде, который ты скрыл... smile
На глюки компилятора кивать нечего, это маловероятно - надо разбираться, нельзя такие мины за спиной оставлять.


--------------------
...
PM   Вверх
comcon1
Дата 2.8.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Сорри, он используется.
Код

data_strings(Interface *&at) {
___WVector::iterator rt = at->hyperarray.begin();
}

Копаться в кодах, через которые проходит мой указатель интерфей -- анреал. Дело в том, что я пересоздаю определенный шаблонный класс в иерархии boost::spirit, дабы написать свой актор.
Написанный мною актор-класс, наследуется boost-овским классом, потом этот класс передает мой указатель еще кому-то.. в общем мой указатель путешествует в качестве параметра еще по всему boost-овскому заголовку. smile
(Все таки создатели boost-a извращенцы, потому что актор по другому написать нельзя -- я делал по аналогии с примером.)
Глядя на то, что там во всех шаблонах в загаловках передается ссылка, я поставил ссылку в самом начале (это, разумеется не описка) и заработало.

Вопросы к boost-у.
Мой указатель -- является параметром буустовских шаблонов. А там -- везде передаются ссылки. Я думаю -- в этом дело.


--------------------
PM MAIL   Вверх
comcon1
Дата 2.8.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Вот так, наверное:
this константный -- а значит неконстантную ссылку на него сделать нельзя.
Он передавался как параметр и где-то бууст его воспринял не так как надо. И до меня дошел не указатель, а черт знает что (указателессылка наверное smile).


--------------------
PM MAIL   Вверх
Earnest
Дата 2.8.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ага, т.е. строка
Код

Interface *at = this;

в начале твоего работающего кода непричем? Уже легче! Тогда ты, видимо, прав. Бывают, к сожалению, такие проблемы с шаблонами - неправильно тип где-нибудь укажешь, и такие чудеса начинаются! В лучшем случае - компилятор трехэтажно ругается, в худшем - падает, как у тебя.
Boost тут в общем-то не причем - это работа с шаблонами пока реализована не так хорошо как хотелось бы.
Ничего, со временем привыкнешь, и заранее будешь знать, где мины лежат... smile

Почему там ссылка у буста - наверняка есть причина. А вообще не напрасно ли ты указатель используешь? Может, лучше просто сам класс - если там и так все по ссылке передается. Как-то использование указателей не очень в духе буста.



--------------------
...
PM   Вверх
comcon1
Дата 3.8.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Действительно не в духе, это у меня. На самом деле там не так все страшно.
Просто я не привык еще.
А компиляторы действительно с шаблонами чудеса творят. И диагностика совершенно нечитабельна - хорошо если строчку укажут, где ошибка.


--------------------
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ну, я считаю, что у VC 7.1 с диагностикой вполне неплохо (а по сравнению с 6, так и вообще волшебно). Читать тяжеловато, но это из-за длинных имен. Я, когда сразу не понимаю, чего на меня ругаются, копирую сообщение в нотепад и сокращаю имена - выкидываю пространства имен, параметры шаблонов и т.д., потому что контекст обычно очевиден. И сообщение приводится к чему-нибудь типа "не могу не консту присвоить конст"... Слава богу, это редко бывает нужно.
Сорри за оффтопик.


--------------------
...
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.