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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возвратить из функции void? 
V
    Опции темы
tilin
Дата 27.10.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Класс А наследуется от IBase в котором есть метод Get(). В классе А этот метод переопределяется для возвращения конкретных значений. Нижеследующий пример конечно не работает, потому что возвращаемые типы Get() отличаются. А как вообще такое можно сделать. 

Код

class IBase
{
  virtual void Get() = 0;
};

template <class T>
class A : public IBase
{
  T value;
  T Get()
  {
    return value;
  }
};



PM MAIL   Вверх
Alek86
Дата 27.10.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



tilin, что значит "не работает"?
что ты от него ожидаешь?
допиши, в коде, желательно


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 27.10.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(tilin @  27.10.2009,  14:10 Найти цитируемый пост)
А как вообще такое можно сделать. 

Такое - никак. А что конкретно надо сделать? Можно к примеру возвращать boost::any, boost::variant. Побольше расскажи о задаче.

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


Новичок



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

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



Не работает, значит не компилируется и ругается на то, что разные типы возвращаемых значений у IBase::Get и A::Get.

Чего хочется:

Код


class C
{

};

vector<IBase*> v;

v.push_back(new A<int>);
v.push_back(new A<float>);
v.push_back(new A<C>);

int i = v[0]->Get();
float f = v[1]->Get();
C c = v[2]->Get();

PM MAIL   Вверх
Andrey44
Дата 27.10.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Цитата(tilin @  27.10.2009,  14:10 Найти цитируемый пост)
virtual void Get() = 0


Цитата(tilin @  27.10.2009,  14:10 Найти цитируемый пост)
T Get()  {    return value;  }

А где же они будут одинаковыми? void!=T


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
tilin
Дата 27.10.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Andrey44 @  27.10.2009,  14:34 Найти цитируемый пост)
А где же они будут одинаковыми? void!=T 


Оно и понятно ) Это я для примера просто.
PM MAIL   Вверх
Alek86
Дата 27.10.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



tilin, такое, как ты показал, невозможно
или boost::any или dynamic_cast


--------------------
user posted image    user posted image
PM MAIL   Вверх
niXman
Дата 27.10.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alek86 @  27.10.2009,  12:52 Найти цитируемый пост)
boost::any

Наверное это будет сложно для начинающего.
Напиши микро-аналог variant. Что-то типа этого:
Код

class Variant {
public:
    Variant():_data() {}
    Variant(const std::string& v):_data(v) {}
    Variant(const Variant& v):_data(v._data) {}
    ~Variant() {}
    /*  */
    bool is_empty() const { return _data.empty(); }
    /*  */
    std::string to_string() const { return _data; }
    int to_int() const {
        if ( is_empty() ) return -1;
        return atoi(_data.c_str());
    }
    long long to_int64() const {
        if ( is_empty() ) return -1;
        return (long long)atof(_data.c_str());
    }
    double to_double() const {
        if ( is_empty() ) return -1;
        return atof(_data.c_str());
    }
private:
    std::string _data;
};


Это сообщение отредактировал(а) niXman - 27.10.2009, 15:03
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
bsa
Дата 27.10.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



tilin, интересно, а как ты этим пользоваться собирался? Вот например, кусок кода не знает ничего о типе Type, для которого был в другом месте кода создан экземляр класса A<Type>... Так вот, что будет делать твой кусок кода с тем, что вернет A<Type>::Get? Я уж не говорю о том, что это даже теоретически скомпилировать нельзя.
PM   Вверх
tilin
Дата 27.10.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 27.10.2009,  15:10)
tilin, интересно, а как ты этим пользоваться собирался? Вот например, кусок кода не знает ничего о типе Type, для которого был в другом месте кода создан экземляр класса A<Type>... Так вот, что будет делать твой кусок кода с тем, что вернет A<Type>::Get? Я уж не говорю о том, что это даже теоретически скомпилировать нельзя.

Ну кратко так:

A<type> создается в одном месте кода, затем помещается в массив. С массивом работает код, который может например определенным образом сортировать элементы массива, добавлять, удалять и т.д. А где-то из этого массива извлекается значение A<type> и используется. Смысл в том, что тот кто помещает в массив и тот кто извлекает из массива имеют нужную информацию о типах. А массив может содержать конечно только элементы одного типа, отсюда и наследование от единого интерфейса.
PM MAIL   Вверх
Alek86
Дата 27.10.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(tilin @  27.10.2009,  15:22 Найти цитируемый пост)
Смысл в том, что тот кто помещает в массив и тот кто извлекает из массива имеют нужную информацию о типах. А массив может содержать конечно только элементы одного типа, отсюда и наследование от единого интерфейса.

тогда dynamic_cast
а если ну совсем уверен, то даже static_cast вниз по иерархии

Это сообщение отредактировал(а) Alek86 - 27.10.2009, 15:40


--------------------
user posted image    user posted image
PM MAIL   Вверх
tilin
Дата 27.10.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alek86 @ 27.10.2009,  15:38)
тогда dynamic_cast
а если ну совсем уверен, то даже static_cast вниз по иерархии

При получении значения static_cast до требуемого типа вполне подходит. И как я понял других вариантов, кроме как возвращать Variant, нет. Буду делать так. Спасибо. 

Меня только смущает, что в этом случае требуется создавать временный объект Variant в функции Get(). 

Это сообщение отредактировал(а) tilin - 27.10.2009, 16:17
PM MAIL   Вверх
niXman
Дата 27.10.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(tilin @  27.10.2009,  13:53 Найти цитируемый пост)
Меня только смущает, что в этом случае требуется создавать временный объект Variant в функции Get().

Создай локальный в твоем классе, инициализируй его в функции Get(), и возвращай на него ссылку.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Lazin
Дата 27.10.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



можно использовать паттерн - visitor

Код

class IVisitor
{
public:
  virtual void operator()(int) = 0;
  virtual  void operator()(double) = 0; 
  virtual  void operator()(std::vector<char> const&) = 0;
  ...
};

class IBase
{
  virtual void Apply(IVisitor&) = 0;
};

template <class T>
class A : public IBase
{
  T value;
  void Apply(IVisitor& visitor)
  {
     visitor(value);
  }
};

class MyVisitor
{
public:
  virtual void operator()(int p)
  {
     std::cout << p << std::endl;
  }
  virtual  void operator()(double)
  {
     std::cout << p << std::endl;
  }
  virtual  void operator()(std::vector<char> const& p)
  {
      std::copy(p.begin(), p.end(), std::ostream_iterator(std::cout, ' '));
      std::cout << std::endl;
  }
};
....
vector<IBase*> v;
v.push_back(new A<int>);
v.push_back(new A<float>);
v.push_back(new A<C>);

MyVisitor myVisitor;

for(int i = 0; i < v.size(); ++i)
    v[i]->Apply(myVisitor);

PM MAIL Skype GTalk   Вверх
tilin
Дата 27.10.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(niXman @ 27.10.2009,  20:37)
Создай локальный в твоем классе, инициализируй его в функции Get(), и возвращай на него ссылку.

Так и сделал. Только не в Get, а сразу при создании объекта. А Get возвращает Вариант.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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