Russian Qt Forum
Сентябрь 30, 2024, 20:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Константность  (Прочитано 8983 раз)
DmitryM
Гость
« Ответ #15 : Сентябрь 22, 2012, 09:33 »

Называется "сменял шило на мыло", теперь какой итератор вернуть - константный или нет
Учи мат. часть. Возвращаемое значение функции, не является частью сигнатурой функции,  поэтому так писать не правильно
Код
C++ (Qt)
   Data * findA(int A)
   {
       int index = findAImpl(A);
       return getA(index);
   }
 
   const Data * findA(int A) const
   {
       int index = findAImpl(A);
       return getA(index);
   }
 

Однако шаблоны предоставляют выбор, какое значение получать
Код
C++ (Qt)
#include <vector>
 
class Test
{
public:
   Test()
   {
       vec_.push_back(1);
       vec_.push_back(2);
 
       foo();
       bar();
   }
 
   void foo()
   {
      std::vector<int>::iterator it = vec_.begin();
      std::vector<int>::const_iterator cit = vec_.begin();
   }
 
   void bar()const
   {
      std::vector<int>::iterator it = vec_.begin(); //  error: conversion from 'std::vector<int>::const_iterator' to non-scalar type std::vector<int>::iterator' requested
      std::vector<int>::const_iterator cit = vec_.begin();
   }
private:
   std::vector<int> vec_;  
};
 
int main()
{
   Test a();
   return 0;
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Сентябрь 22, 2012, 11:32 »

Боже. Вот меня заглючило. Говоря volatile я имел в виду mutable. Улыбающийся
Я тоже перепутал в посте #4  Улыбающийся Исправил. Вроде mutable и предназначен для таких целей, но я не знаю как "вернуть mutable указатель". А завести mutable член, перелить сначала в него и затем вернуть можно, но не яснее и даже не короче
Записан
DmitryM
Гость
« Ответ #17 : Сентябрь 22, 2012, 20:39 »

:рукалицо:
Igors, andrew.k если вы себя называете C++ программистами, то ответьте на вопрос, вызов какого FindItem должен поставить компилятор?
Код:
class MyClass {
 
MyItem * FindItem( ...);
const MyItem * FindItem( ...) const;
..
};
int mail(){
   MyClass foo();
   //....
   foo. FindItem();
}
Записан
andrew.k
Гость
« Ответ #18 : Сентябрь 23, 2012, 01:54 »

:рукалицо:
Igors, andrew.k если вы себя называете C++ программистами, то ответьте на вопрос, вызов какого FindItem должен поставить компилятор?
Код:
class MyClass {
 
MyItem * FindItem( ...);
const MyItem * FindItem( ...) const;
..
};
int mail(){
   MyClass foo();
   //....
   foo. FindItem();
}
Тут будет вызов неконстантной версии, т.к. функция mail?? (ты я так понимаю, нас не считаешь за программстов, но себя да : ) не имеет спецификатора const.

Но к чему этот вопрос? Рукалицо это ты удачно подметил.

Насчет первого примера, я торопился написал ерунду, не проверил даже. Я написал это выше.
Есть претензии ко второму примеру?
« Последнее редактирование: Сентябрь 23, 2012, 02:03 от andrew.k » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Сентябрь 23, 2012, 06:02 »

Насчет первого примера, я торопился написал ерунду, не проверил даже. Я написал это выше.
Есть претензии ко второму примеру?
Если искать решение самому, то ошибки неизбежны, и это нормально. А вот отвечать, на мой взгляд, не всякому следует. "если вы считаете себя", "учи матчасть" - борзости с избытком. А доходит до дела - тупо лепит книжку и даже не в тему. Ну и зачем вступать с ним в бесполезные пререкания?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.196 секунд. Запросов: 23.