Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > модификатор метода const


Автор: Artemon 14.10.2011, 11:04
Код

class B
{
};

class A
{
  std::auto_ptr<B> val; 

  public:
   std::auto_ptr<B> GetQuery()const
   {
   return val;
   }
};


При компиляции выдается ошибка, говорящая о том, что у объекта B нет конструктора копирования (хотя он есть по умолчанию). 
Если я убираю модификатор const, то все нормально собирается.

Автор: mes 14.10.2011, 11:42
Цитата(Artemon @  14.10.2011,  10:04 Найти цитируемый пост)
 std::auto_ptr<B> GetQuery()const

 smile   это до первого применения    smile 
советую почитать про стратегию хранения auto_ptr.. 

Цитата(Artemon @  14.10.2011,  10:04 Найти цитируемый пост)
выдается ошибка,

с auto_ptr нельзя снять копию, не изменив оригинал, поэтому компилятор и возмущается smile


Автор: Artemon 14.10.2011, 12:34
Цитата(mes @  14.10.2011,  11:42 Найти цитируемый пост)
   это до первого применения     

Что имеете ввиду ?

Добавлено через 3 минуты и 22 секунды
Насколько я знаю исходная копия auto_ptr  перестанет быть валидной, а вот с копией все будет в порядке.

Автор: newbee 14.10.2011, 12:40
Цитата(Artemon @  14.10.2011,  13:34 Найти цитируемый пост)
Насколько я знаю исходная копия auto_ptr  перестанет быть валидной, а вот с копией все будет в порядке. 
Ну так возвращая копию val ты и меняешь исходный объект, что недопустипо в константном методе.

Автор: Artemon 14.10.2011, 12:46
Цитата(newbee @  14.10.2011,  12:40 Найти цитируемый пост)
Ну так возвращая копию val ты и меняешь исходный объект, что недопустипо в константном методе.

Я уже не про модификатор const, а про то что mes как бэ намекаэ что будут проблемы дальше с возвращенным auto_ptr. Вот и говорю что максимум что будет - это то, что оригинальный auto_ptr станет не валидным, я прав ?

Автор: mes 14.10.2011, 13:16
Цитата(Artemon @  14.10.2011,  11:46 Найти цитируемый пост)
от и говорю что максимум что будет - это то, что оригинальный auto_ptr станет не валидным, я прав ? 

 smile 
Цитата(Artemon @  14.10.2011,  11:46 Найти цитируемый пост)
а про то что mes как бэ намекаэ что будут проблемы дальше с возвращенным auto_ptr. 

а если внимательней :
Цитата(mes @  14.10.2011,  10:42 Найти цитируемый пост)
это до первого применения 

иль у Вас GetQuery() вызывается один раз ?
 smile 


Автор: Artemon 14.10.2011, 13:23
Цитата(mes @  14.10.2011,  13:16 Найти цитируемый пост)
иль у Вас GetQuery() вызывается один раз ?

Да, именно так, через этот метод вытаскивается результат закрывающейся формы.

Автор: mes 14.10.2011, 13:26
Цитата(Artemon @  14.10.2011,  12:23 Найти цитируемый пост)
Да, именно так, через этот метод вытаскивается результат закрывающейся формы. 
ну..ну.. удачи при отладке smile


Автор: azesmcar 14.10.2011, 14:01
Цитата(Artemon @  14.10.2011,  13:23 Найти цитируемый пост)
Да, именно так, через этот метод вытаскивается результат закрывающейся формы. 

тогда
1. метод не должен быть константным, так-как он модифицирует текущий объект. 
2. имя для такого метода неподходящее, оно не говорит пользователю о том, что объект модифицируется и второй раз его вызывать нельзя.
3. необходимо сделать проверку на двойной вызов функции.

Автор: Artemon 14.10.2011, 14:26
Цитата(mes @  14.10.2011,  13:26 Найти цитируемый пост)
ну..ну.. удачи при отладке

Не вижу каких-либо даже мало мальских проблем  smile 


azesmcar, согласен.

Автор: mes 14.10.2011, 14:38
Цитата(Artemon @  14.10.2011,  13:26 Найти цитируемый пост)

Не вижу каких-либо даже мало мальских проблем  smile 

так хорошо танцуете, не буду Вас разубеждать smile



Автор: Artemon 14.10.2011, 14:48
Всем спасибо за ответы, тему закрываю.

Автор: baldina 14.10.2011, 14:51
Artemon, просто любопытно, чем Вас не устроило простое
Код

class B
{
};
class A
{
  B val; 
  public:
   B GetQuery()const
   {
   return val;
   }
};


Автор: mes 14.10.2011, 14:56
val  указатель на динамический объект..  и полагаю, что тс  хочется не думать, забрали его или он еще хранится в A..



Автор: Artemon 14.10.2011, 15:14
baldina, все именно так, как сказал mes

Автор: mes 14.10.2011, 15:26
аx да, чего то про основной вопрос забыли..  чтоб метод можно было обозначить const, пометьте auto_ptr mutable.. 

 

Автор: bsa 14.10.2011, 16:47
А лучше auto_ptr заменить на shared_ptr (есть в boost'е и стандарте c++11)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)