this const
От: server_mouse Беларусь about:blank
Дата: 10.04.03 08:44
Оценка:
Hi ALL. Вопрос очень простой, но я что-то торможу....

class CSockClient;
extern void foo(CSockClient *pClient);

class CSockClient
{
 public:
 virtual void class_foo()
 {
  foo(this);    
// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
 }

  int a;
};

void foo(CSockClient *pClient)
{
 pClient->a=0;
}


Собственно почему компилятор решил сделать this константным? И как решить проблему?
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
Re: this const
От: Дмитрий Наумов  
Дата: 10.04.03 08:50
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL. Вопрос очень простой, но я что-то торможу....


SM>
SM>class CSockClient;
SM>extern void foo(CSockClient *pClient);

SM>class CSockClient
SM>{
SM> public:
SM> virtual void class_foo()
SM> {
SM>  foo(this);    
SM>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
SM> }

SM>  int a;
SM>};

SM>void foo(CSockClient *pClient)
SM>{
SM> pClient->a=0;
SM>}
SM>


SM>Собственно почему компилятор решил сделать this константным? И как решить проблему?


Место откуда CSockCLient::class_foo() вызывается покажи и все ясно будет, потому как там беда
... << RSDN@Home 1.0 beta 6a >>
Re: this const
От: Сергей Зизев Украина  
Дата: 10.04.03 08:51
Оценка: +1
Здравствуйте, server_mouse, Вы писали:

_>Hi ALL. Вопрос очень простой, но я что-то торможу....


_>
_>class CSockClient;
_>extern void foo(CSockClient *pClient);

_>class CSockClient
_>{
_> public:
_> virtual void class_foo()
_> {
_>  foo(this);    
_>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
Приведенный пример не может соответствовать данной ошибке. т.к. нет класса CSockServ
Точнее давай
_> }
<...>
Re: this const
От: MaximE Великобритания  
Дата: 10.04.03 08:55
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL. Вопрос очень простой, но я что-то торможу....


SM>
SM>class CSockClient;
SM>extern void foo(CSockClient *pClient);

SM>class CSockClient
SM>{
SM> public:
SM> virtual void class_foo()
SM> {
SM>  foo(this);    
SM>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
SM> }

SM>  int a;
SM>};

SM>void foo(CSockClient *pClient)
SM>{
SM> pClient->a=0;
SM>}
SM>


SM>Собственно почему компилятор решил сделать this константным? И как решить проблему?


Это не *this константный, а указатель на *this.
void foo(CSockClient *const pClient);
Re[2]: this const
От: MTrukhmanov Россия  
Дата: 10.04.03 09:04
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Это не *this константный, а указатель на *this.

ME>
ME>void foo(CSockClient *const pClient);
ME>

Ой, а что это?
Что-то типа этого?
void foo(const int i);
Re[3]: this const
От: MaximE Великобритания  
Дата: 10.04.03 09:30
Оценка:
Здравствуйте, MTrukhmanov, Вы писали:

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


ME>>Это не *this константный, а указатель на *this.

ME>>
ME>>void foo(CSockClient *const pClient);
ME>>

MT>Ой, а что это?
MT>Что-то типа этого?
MT>
MT>void foo(const int i);
MT>


Нет, это типа

void foo(const int* i);
void foo(int* const i);


суть разные (перегруженная) функции.
Re[4]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:10
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>>void foo(CSockClient *const pClient);

MT>Ой, а что это?
MT>Что-то типа этого?
MT>void foo(const int i);

ME>Нет, это типа
ME>void foo(const int* i);
ME>void foo(int* const i);

ME>суть разные (перегруженная) функции.

Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.
А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Re[5]: this const
От: Артур Россия  
Дата: 10.04.03 11:27
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:


МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.

МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.

Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
... << RSDN@Home 1.0 beta 6a >>
Re[5]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 11:34
Оценка: +1 -1
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.

МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.

void foo(const int* i);
void foo(int const* i);

это одно и тоже, но не тоже самое, что
void foo(int* i);
... << RSDN@Home 1.0 beta 6a >>
Re[5]: this const
От: MaximE Великобритания  
Дата: 10.04.03 11:40
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.

МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.

void foo(const int* i) // i - неконстантный указатель на константный int
{
    *i = 0; // нельзя
    ++i; // можно
}

void foo(int* const i) // i - константный указатель на неконстантный int
{
    *i = 0; // можно
    ++i; // нельзя
}
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:41
Оценка:
Здравствуйте, Артур, Вы писали:

А>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.


Любезно
А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 11:48
Оценка: +1
Здравствуйте, Дмитрий Наумов, Вы писали:

МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.

МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
ДН>void foo(const int* i);
ДН>void foo(int const* i);

ДН>это одно и тоже, но не тоже самое, что
ДН>void foo(int* i);

Согласен. А я разве утверждал обратное?
Суть была в том, что вообще все четыре декларации объявляют одно и то же:
    void foo(const int* i); 
    void foo(const int* const i); 
    void foo(int const* i);
    void foo(int const* const i);
Re[6]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:02
Оценка: 8 (1)
Здравствуйте, MaximE, Вы писали:

МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.

МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.

ME>void foo(const int* i) // i - неконстантный указатель на константный int
ME>{
ME>    *i = 0; // нельзя
ME>    ++i; // можно
ME>}

ME>void foo(int* const i) // i - константный указатель на неконстантный int
ME>{
ME>    *i = 0; // можно
ME>    ++i; // нельзя
ME>}

Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int).
А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).
Re[7]: this const
От: Артур Россия  
Дата: 10.04.03 12:03
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Здравствуйте, Артур, Вы писали:


А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.


МТ>Любезно

МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления

А при чём тут это? очень много чего нельзя объявить в классе.
void fo()
int fo()
например. Это то же не одна и та же функция??

а
void foo(int* i);
void foo(const int* i);

очень даже хорошо уживаются в одном классе.
... << RSDN@Home 1.0 beta 6a >>
Re[7]: this const
От: MaximE Великобритания  
Дата: 10.04.03 12:29
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int).

МТ>А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).

Дык никто про интерфейсы не говорил.
Речь была о том, что int* const и const int* — совсем не одно и то же.
Re[8]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:39
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Речь была о том, что int* const и const int* — совсем не одно и то же.


Ну да, с этого все и началось. Только я до чего докопался-то: зачем const в параметре (int* const)?
Какой в нем смысл? И привел более простой пример: параметр (int const).
Re[8]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 12:51
Оценка:
Здравствуйте, Артур, Вы писали:

А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.

МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
А>А при чём тут это? очень много чего нельзя объявить в классе.
А>void fo()
А>int fo()
А>например. Это то же не одна и та же функция??

А>а

А>void foo(int* i);
А>void foo(const int* i);
А>очень даже хорошо уживаются в одном классе.

1.ОК. Про "одно и то же" я, похоже, неправильно сказал
2.Я говорю не про foo(int*) и foo(const int*), а про foo(int*) и foo(int* const)

Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что
1.кажется бессмысленным указывать const по значению
2.VC6 генерит одни и те же имена
Re[9]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 13:35
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что

МТ>1.кажется бессмысленным указывать const по значению
МТ>2.VC6 генерит одни и те же имена

const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
... << RSDN@Home 1.0 beta 6a >>
Re[10]: this const
От: Михаил Трухманов Россия  
Дата: 10.04.03 13:50
Оценка: 10 (1)
Здравствуйте, Дмитрий Наумов, Вы писали:

МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что

МТ>1.кажется бессмысленным указывать const по значению
МТ>2.VC6 генерит одни и те же имена

ДН>const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...


Вопросы:
Действительно ли эта фича полезна? (параметр const по значению)
Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?

Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Re[11]: this const
От: Дмитрий Наумов  
Дата: 10.04.03 14:39
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Вопросы:

МТ>Действительно ли эта фича полезна? (параметр const по значению)
МТ>Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?

МТ>Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?


Вопрос на пять баллов... Ну скажем так, раньше использовал, в больших (на несколько экранов) методах. Но теперь у меня на вооружение поступил рефакторинг и типа никаких огромных методов.
Поэтому скажем так, использовать использую, но иногда...
... << RSDN@Home 1.0 beta 6a >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.