Разница между this->Do(t); и Do(t);?
От: Azir Беларусь  
Дата: 28.05.04 14:08
Оценка:
Встретил такую вещь:
class A
{
    template<typename T>
    A(T const& t)
    {
        this->Do(t);
    }

    template<typename T>
    void Do(T t);
};


А почему это не записать так:
A(T const& t)
{
    Do(t);
}
Re: Разница между this->Do(t); и Do(t);?
От: Bell Россия  
Дата: 28.05.04 14:20
Оценка:
Здравствуйте, Azir, Вы писали:
...

Так написать можно. Почему выбран первый вариант — лучше спросить у того, кто это написал.
Любите книгу — источник знаний (с) М.Горький
Re: Разница между this->Do(t); и Do(t);?
От: PM  
Дата: 28.05.04 14:20
Оценка:
Здравствуйте, Azir, Вы писали:

A> Встретил такую вещь:

A>
A> class A
A> {
A>  template<typename T>
A>  A(T const& t)
A>  {
A>   this->Do(t);
A>  }
A> 
A>  template<typename T>
A>  void Do(T t);
A> };
A>

A>
A> А почему это не записать так:
A>
A> A(T const& t)
A> {
A>  Do(t);
A> }
A>

Может быть потому, что выше может быть такое
template<typename T>
void Do(T t)
{}
Posted via RSDN NNTP Server 1.8
Re: Разница между this->Do(t); и Do(t);?
От: ssm Россия  
Дата: 28.05.04 14:21
Оценка:
Здравствуйте, Azir, Вы писали:


A>А почему это не записать так:


А может планировалось несколько конструкторов, которым могло бы понадобиться Do();
Re: Разница между this->Do(t); и Do(t);?
От: _AK_ Россия  
Дата: 28.05.04 14:21
Оценка: 2 (1)
Здравствуйте, Azir, Вы писали:

A>Встретил такую вещь:

A>
A>class A
A>{
A>    template<typename T>
A>    A(T const& t)
A>    {
        this->>Do(t);
A>    }

A>    template<typename T>
A>    void Do(T t);
A>};
A>


A>А почему это не записать так:

A>
A>A(T const& t)
A>{
A>    Do(t);
A>}
A>


C++ Templates: The Complete Guide
By David Vandevoorde

For class templates with base classes, using a name x by itself is not always equivalent to this->x, even though a member x is inherited. For example:
template <typename T> 
class Base { 
  public: 
    void exit(); 
};

template <typename T> 
class Derived : Base<T> { 
  public: 
    void foo() { 
        exit();   // calls external exit() or error 
    } 
};

In this example, for resolving the symbol exit inside foo(), exit() defined in Base is never considered. Therefore, either you have an error, or another exit() (such as the standard exit()) is called.

We discuss this issue in Section 9.4.2 on page 136 in detail. For the moment, as a rule of thumb, we recommend that you always qualify any symbol that is declared in a base that is somehow dependent on a template parameter with this-> or Base<T>::. If you want to avoid all uncertainty, you may consider qualifying all member accesses (in templates).

Исправлено форматирование. Пожалуйста, не забывайте пользоваться тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re[2]: Разница между this->Do(t); и Do(t);?
От: ssm Россия  
Дата: 28.05.04 14:22
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Azir, Вы писали:



A>>А почему это не записать так:


ssm>А может планировалось несколько конструкторов, которым могло бы понадобиться Do();


бред :))
Re: Разница между this->Do(t); и Do(t);?
От: Воронков Василий Россия  
Дата: 28.05.04 14:23
Оценка:
"Azir" <17527@news.rsdn.ru> wrote in message news:658425@news.rsdn.ru...

В большинстве случаях, если речь не идет о виртуальности, это вопрос стиля. например, можно взять за правило к членам текущего класса всегда обращаться через this, к членам базового через MyBaseName и пр. В общем as you like it.
Posted via RSDN NNTP Server 1.9 alpha
Re[2]: Разница между this->Do(t); и Do(t);?
От: Lorenzo_LAMAS  
Дата: 28.05.04 14:27
Оценка: 1 (1)
Только к данному случаю это не имеет отношения.
Of course, the code must be complete enough to compile and link.
Re[2]: Разница между this->Do(t); и Do(t);?
От: Bell Россия  
Дата: 28.05.04 14:28
Оценка:
Здравствуйте, _AK_, Вы писали:


_AK>For class templates with base classes, using a name x by itself is not always equivalent to this->x, even though a member x is inherited.


К приведенному примеру это не имеет никакого отношения.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Разница между this->Do(t); и Do(t);?
От: Azir Беларусь  
Дата: 28.05.04 14:31
Оценка:
Здравствуйте, Bell, Вы писали:

B>Так написать можно. Почему выбран первый вариант — лучше спросить у того, кто это написал.

Дело в том, что для вызова других методов используется 2-ой вариант.

PS Встретил это я в boost::BOOST_FUNCTION_FUNCTION
Re: Разница между this->Do(t); и Do(t);?
От: dupamid Россия  
Дата: 28.05.04 14:32
Оценка:
Здравствуйте, Azir.

В таком простом примере в этом нет смысла, но в случае шаблонных классов с наследованием от зависимого типа есть разница. Пример:
template<class T>
class A : public T
{
public:
    void f()
    {
         Do(); // #1
    }
};

Этот код не верен так как при такой записи будет вызываться какая-то функция Do уже видимая в точке #1. Даже если у базовго класса T будут функция-член Do — она, по Стандарту, не позовется. Для того чтобы она позвалась она нужно написать, например, "this->Do()".
Re: Разница между this->Do(t); и Do(t);?
От: Buzzard  
Дата: 28.05.04 14:40
Оценка: 1 (1)
Здравствуйте, Azir, Вы писали:

A>Встретил такую вещь:

A>
A>class A
A>{
A>    template<typename T>
A>    A(T const& t)
A>    {
        this->>Do(t);
A>    }

A>    template<typename T>
A>    void Do(T t);
A>};
A>


A>А почему это не записать так:

A>
A>A(T const& t)
A>{
A>    Do(t);
A>}
A>



Есть мнение, что так удобнее писать, когда редактор поддерживает вывод списка членов класса после операторов . и ->
Re[2]: Разница между this->Do(t); и Do(t);?
От: Azir Беларусь  
Дата: 28.05.04 14:49
Оценка:
Здравствуйте, dupamid, Вы писали:

D>В таком простом примере в этом нет смысла, но в случае шаблонных классов с наследованием от зависимого типа есть разница.

Наследование имеет место, но не от зависимого класса.

В том же классе используется вариант вызова другого метода как Do2();, а не this->Do2();. Поэтому, я думаю, что автор осознанно применял оба варианта. Может быть я, упростив класс, исказил картину. Встретил это я в boost::BOOST_FUNCTION_FUNCTION.
Re[3]: Разница между this->Do(t); и Do(t);?
От: dupamid Россия  
Дата: 28.05.04 14:59
Оценка: 1 (1)
Здравствуйте, Azir, Вы писали:

A>В том же классе используется вариант вызова другого метода как Do2();, а не this->Do2();. Поэтому, я думаю, что автор осознанно применял оба варианта. Может быть я, упростив класс, исказил картину. Встретил это я в boost::BOOST_FUNCTION_FUNCTION.


Тогда, скорее всего, это сделано не намерено, так как смысла не имеет. Возможно появилось при копировании кода из места, где это имело значение. Еще одно предположение, что это обход какой-то баги какого-то компилятора. Хотя в общем строить догадки можно много, но реально если изменить код на вызов просто вызов "assign_to" ничего поменятся не должно.
Re: Разница между this->Do(t); и Do(t);?
От: _Winnie Россия C++.freerun
Дата: 28.05.04 16:34
Оценка: 1 (1)
Здравствуйте, Azir, Вы писали:

Иногда меня вдруг приперает использовать "this->" как "m_". Надеюсь превратить это в полезную привычку. Помогает при чтении чужих программ и своих в никаком состоянии.
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.