Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 17:47   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию Интерфейс в качестве параметра

Есть интерфейс:

Код:
class iInterface
{
public:
  virtual ~iInterface(){}

  virtual void DoSomething()=0;
};
И два класса с реализацией:

Код:
class CClass1 : public iInterface
{
public:
  CClass1();
  ~CClass1();

  virtual void DoSomething(){/*реализация*/};
};

class CClass2 : public iInterface
{
public:
  CClass2();
  ~CClass2();

  virtual void DoSomething(){/*другая реализация*/};
};
Подскажите, как правильно написать в классе CClass3 функцию, которая будет принимать в качестве параметра любой объект, который является наследником iInterface и выполнять вызов DoSomething() на этом параметре?

Вроде шаблоны реализуют что-то подобное, но как ими пользоваться я не разобрался. Желательно небольшой пример.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 20.12.2011, 18:42   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Может вот так?
Код:
class CClass3
{
public:
   void DoSomething( iInterface* pTarget  ) { pTarget ->DoSomething(); }
};
А использовать вот так:

Код:
iInterface* pAgent = new CClass1(); //объект класса CClass1

CClass3 manipulator; 

manipulator.DoSomething(pAgent); //манипулятор запустит метод агента, 
          //причем запустится версия метода, описанная в классе CClass1

delete pAgent;

iInterface* pAgent = new CClass2(); //объект класса CClass2


manipulator.DoSomething(pAgent); //манипулятор запустит метод агента, 
          //причем запустится версия метода, описанная в классе CClass2

delete pAgent;
_Bers вне форума Ответить с цитированием
Старый 20.12.2011, 18:59   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Спасибо! Всё работает.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.01.2012, 13:49   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Хочу уточнить.

В такой реализации, как написал _Bers,

Код:
iInterface* pAgent = new CClass1(); //объект класса CClass1

CClass3 manipulator; 

manipulator.DoSomething(pAgent); //манипулятор запустит метод агента, 
          //причем запустится версия метода, описанная в классе CClass1
экземпляр класса CClass1, будет передан в manipulator.DoSomething() по ссылке или по значению?
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.01.2012, 14:54   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Хочу уточнить.

В такой реализации, как написал _Bers,

Код:
iInterface* pAgent = new CClass1(); //объект класса CClass1

CClass3 manipulator; 

manipulator.DoSomething(pAgent); //манипулятор запустит метод агента, 
          //причем запустится версия метода, описанная в классе CClass1
экземпляр класса CClass1, будет передан в manipulator.DoSomething() по ссылке или по значению?
А как ты считаешь, метод DoSomething манипулятора принимает на входе ссылку? Значение? Или указатель?

Код:
class CClass3
{
public:
   void DoSomething( iInterface* pTarget  ) { pTarget ->DoSomething(); }
};
_Bers вне форума Ответить с цитированием
Старый 13.01.2012, 15:09   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Наверное, указатель. Значит по ссылке? Т.е. манипуляция с данными объекта в manipulator.DoSomething() приведёт к изменению данных за пределами manipulator.DoSomething()?

PS Считать хорошо, но лучше переспросить лишний раз
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.01.2012, 15:22   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Наверное, указатель. Значит по ссылке? Т.е. манипуляция с данными объекта в manipulator.DoSomething() приведёт к изменению данных за пределами manipulator.DoSomething()?

PS Считать хорошо, но лучше переспросить лишний раз
1. Нет. Функция принимает указатель на объект, и работает с указателем.
Нет там никаких ссылок.

2. Да, она может изменить содержимое объекта.

/ps Лучше лишний раз перечитай тему "указатели", и "ссылки"
_Bers вне форума Ответить с цитированием
Старый 13.01.2012, 15:24   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Наверное, указатель. Значит по ссылке?
Гениально
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.01.2012, 15:36   #9
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

_Bers, спасибо)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив в качестве параметра _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 15 06.07.2010 22:59
TextBox в качестве параметра функции/процедуры Голованов Д. Microsoft Office Excel 6 01.12.2009 10:38
Массив в качестве параметра DeKot Общие вопросы Delphi 6 15.10.2009 22:32
Пользовательская функция с диапазоном в качестве параметра SanSanblch Microsoft Office Excel 2 29.05.2009 17:37