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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2013, 09:45   #1
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию Имитация интерфейсов в С++

Доброго времени суток! Прошу помочь разобраться в следующей ситуации. Требуется реализовать иерархию классов, имеющих определённый интерфейс. Так как в плюсах такого понятия нет, реализацию интерфейса заменил наследованием от абстрактного класса (I). Код, в котором воспроизводится проблема, приведён ниже.

Код:
#include <iostream>
#include <vector>
using namespace std;

template< typename P > 
class A1;

template< typename P >
class I {
public:
	virtual void f(A1< P > arg) = 0;
};

template< typename P >
class A1 {};

template< typename P >
class A2: public A1< vector< A1< P >* > >,
	      public I< P > {
public:
	virtual void f(A1< P > arg) {;}
};

template< typename M, typename P >
class B1: public I< P > {};

template< typename P >
class B2: public B1< A2< P >, vector< A1< P >* > > {};

template< typename P >
class B3: public B2< P > {
public:
	virtual void f(A1< P > arg) {;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B3< int > b3; //LINE 42
}
При попытке его скомпиллировать VS2010 выплёвывает следующее сообщение:

Цитата:
test.cpp(42): error C2259: B3<P>: невозможно создать экземпляр абстрактного класса
1> with
1> [
1> P=int
1> ]
1> из-за следующих членов:
1> void I<P>::f(A1<P>): абстрактный
1> with
1> [
1> P=std::vector<A1<int> *>
1> ]
1> test.cpp(15): см. объявление "I<P>::f"
1> with
1> [
1> P=std::vector<A1<int> *>
1> ]
Никак не могу понять, почему класс B3 оказался абстрактным - ведь единственная чистая виртуальная функция в нём реализована.

Последний раз редактировалось Stilet; 25.09.2013 в 09:50.
Diablero вне форума Ответить с цитированием
Старый 25.09.2013, 11:05   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Я причасал твой говнокод и выпилил из него все лишнее.

Вот что получилось:
http://rise4fun.com/Vcpp/dfB
Код:
#include <iostream>
#include<vector>
using namespace std;

template< class P >struct A1 {};

template< class P >struct I { virtual void f(A1<P> arg) = 0; };

template< class P >struct B3: I< vector< A1<P>* > > 
{ 
  virtual void f(A1<P> arg) {;} 
};

int main()
{
	B3< int > b3; 
  
}
Лекарство:
http://rise4fun.com/Vcpp/v6pf
Код:
#include <iostream>
#include<vector>
using namespace std;

template< class P >struct A1 {};

template< class P >struct I { virtual void f(A1<P> arg) = 0; };


template< class P >struct B3: I< vector< A1<P>* > > 
{
  typedef vector< A1<P>* > Arg; 
  virtual void f(A1< Arg > arg) 
  {
    (void) arg; //<--- что бы заглушить: warning C4100: 'arg' : unreferenced formal parameter
  } 
};

int main()
{
	B3< int > b3; 
}
Исправленная версия оригинального кода:

http://rise4fun.com/Vcpp/iy3
Код:
#include <iostream>
#include <vector>
using namespace std;

template< typename P > 
class A1;

template< typename P >
class I {
public:
	virtual void f(A1< P > arg) = 0;
};

template< typename P >
class A1 {};

template< typename P >
class A2: public A1< vector< A1< P >* > >,
	      public I< P > {
public:
	virtual void f(A1< P > arg) {;}
};

template< typename M, typename P >
class B1: public I< P > {};

template< typename P >
class B2: public B1< A2< P >, vector< A1< P >* > > {};

template< typename P >
class B3: public B2< P > {
  typedef vector< A1<P>* > Arg;
public:
  virtual void f(A1< Arg > arg) 
  {
    (void) arg; //<--- что бы заглушить: warning C4100: 'arg' : unreferenced formal parameter
  } 
};

int _tmain(int argc, _TCHAR* argv[])
{
  (void) argc; //<--- что бы заглушить:  : warning C4100: 'argv' : unreferenced formal parameter
  (void) argv; //<--- что бы заглушить:  : warning C4100: 'argc' : unreferenced formal parameter
  
	B3< int > b3; //LINE 42
}
Диагноз: "template головного мозга у поциэнта. Расстройство временное, само проходит с опытом".

Последний раз редактировалось _Bers; 25.09.2013 в 11:08.
_Bers вне форума Ответить с цитированием
Старый 25.09.2013, 11:45   #3
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Я причасал твой говнокод и выпилил из него все лишнее.

Вот что получилось:
http://rise4fun.com/Vcpp/dfB
Код:
#include <iostream>
#include<vector>
using namespace std;

template< class P >struct A1 {};

template< class P >struct I { virtual void f(A1<P> arg) = 0; };

template< class P >struct B3: I< vector< A1<P>* > > 
{ 
  virtual void f(A1<P> arg) {;} 
};

int main()
{
	B3< int > b3; 
  
}
Лекарство:
http://rise4fun.com/Vcpp/v6pf
Код:
#include <iostream>
#include<vector>
using namespace std;

template< class P >struct A1 {};

template< class P >struct I { virtual void f(A1<P> arg) = 0; };


template< class P >struct B3: I< vector< A1<P>* > > 
{
  typedef vector< A1<P>* > Arg; 
  virtual void f(A1< Arg > arg) 
  {
    (void) arg; //<--- что бы заглушить: warning C4100: 'arg' : unreferenced formal parameter
  } 
};

int main()
{
	B3< int > b3; 
}
Исправленная версия оригинального кода:

http://rise4fun.com/Vcpp/iy3
Код:
#include <iostream>
#include <vector>
using namespace std;

template< typename P > 
class A1;

template< typename P >
class I {
public:
	virtual void f(A1< P > arg) = 0;
};

template< typename P >
class A1 {};

template< typename P >
class A2: public A1< vector< A1< P >* > >,
	      public I< P > {
public:
	virtual void f(A1< P > arg) {;}
};

template< typename M, typename P >
class B1: public I< P > {};

template< typename P >
class B2: public B1< A2< P >, vector< A1< P >* > > {};

template< typename P >
class B3: public B2< P > {
  typedef vector< A1<P>* > Arg;
public:
  virtual void f(A1< Arg > arg) 
  {
    (void) arg; //<--- что бы заглушить: warning C4100: 'arg' : unreferenced formal parameter
  } 
};

int _tmain(int argc, _TCHAR* argv[])
{
  (void) argc; //<--- что бы заглушить:  : warning C4100: 'argv' : unreferenced formal parameter
  (void) argv; //<--- что бы заглушить:  : warning C4100: 'argc' : unreferenced formal parameter
  
	B3< int > b3; //LINE 42
}
Диагноз: "template головного мозга у поциэнта. Расстройство временное, само проходит с опытом".
Теперь понял, в чём косяк, спасибо
Diablero вне форума Ответить с цитированием
Старый 25.09.2013, 12:36   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Я ниче не причесывал и не особо всматривался в код, но вроде бы ты интерфейс наследуешь с разными специализациями шаблона, а поэтому получается несколько чисто виртуальных функций в B3 (он остается абстрактным).
Есть версия, что если в B3 из первого поста добавить что-то вроде:
Код:
virtual void f(A1< vector< A1< P >* > >) {;}
то может заработать (не проверял).
А вот, проверил: http://rise4fun.com/Vcpp/hYR
Вцелом, это говнокод. Каждый раз, когда я вижу такие выкрутасы, хочу узнать "зачем? чего ты добиваешься этим кодом?".
Цитата:
Диагноз: "template головного мозга у поциэнта. Расстройство временное, само проходит с опытом".
однако, врач? - мне, помнится поставили "ООП головного мозга" xD

Последний раз редактировалось rrrFer; 25.09.2013 в 12:55.
rrrFer вне форума Ответить с цитированием
Старый 25.09.2013, 13:03   #5
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Вцелом, это говнокод. Каждый раз, когда я вижу такие выкрутасы, хочу узнать "зачем? чего ты добиваешься этим кодом?".
Скилы прокачиваю, повышаю ЧСВ)))
Diablero вне форума Ответить с цитированием
Старый 25.09.2013, 13:53   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
однако, врач? - мне, помнится поставили "ООП головного мозга" xD
Ну потому что не нужно плодить ненужные сущности.

Здесь - выдержка кода, которая иллюстрирует проблему.
По факту - хз, что делает ТС, может быть все эти шаблоно-коды и нужны.

Но в вашем случае, задача была известна, и дополнительные сущности точно не были нужны.

Цитата:
Сообщение от Diablero Посмотреть сообщение
Скилы прокачиваю, повышаю ЧСВ)))
Это нормальное течение развития)

Я предлагаю вам задуматься: профессиональный программист должен приносить компании прибыль.

То бишь, код, который он пишет должен приносить прибыль.

Подумайте о том, каким должен быть код, что бы он приносил компании прибыль.
_Bers вне форума Ответить с цитированием
Старый 25.09.2013, 15:12   #7
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение

Я предлагаю вам задуматься: профессиональный программист должен приносить компании прибыль.

То бишь, код, который он пишет должен приносить прибыль.

Подумайте о том, каким должен быть код, что бы он приносил компании прибыль.
Спасибо за совет )
Diablero вне форума Ответить с цитированием
Старый 25.09.2013, 15:28   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Каждый раз, когда я вижу такие выкрутасы

Rififi вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение интерфейсов X2 cashobmen Фриланс 1 26.01.2012 16:20
Объясните смысл интерфейсов MyLastHit C# (си шарп) 8 22.11.2011 18:43
Использование интерфейсов .NET dis Общие вопросы .NET 4 25.09.2010 19:54