наследование реализации и порядок инициализации мемберов & базового класса
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.04.13 11:12
Оценка:
снова приветствую!

пытаюсь замутить такую штуковину:

#include <iostream>

struct io_service {};
struct socket_type { socket_type(io_service &){} };
struct queue_type {};

enum class itype {
   tcp, udp
};

template<itype>
struct impl;

template<>
struct impl<itype::tcp> {
   impl(socket_type &, queue_type &)
   {}
};

template<>
struct impl<itype::udp> {
   impl(socket_type &, queue_type &)
   {}
};

template<itype ST>
struct socket: impl<ST> {
   socket(io_service &ios)
      :_sock(ios)             // 1
      ,_queue()               // 2
      ,impl<ST>(_sock, _queue)// 3
   {}
   
   socket_type _sock;
   queue_type _queue;
};

int main() {
   io_service ios;
   
   socket<itype::tcp> sock(ios);
}

но компилятор говорит:

source.cpp: In instantiation of 'socket<ST>::socket(io_service&) [with itype ST = (itype)0]':
source.cpp:42:31: required from here
source.cpp:36:15: warning: 'socket<(itype)0>::_queue' will be initialized after [-Wreorder]
queue_type _queue;
^
source.cpp:32:30: warning: base 'impl<(itype)0>' [-Wreorder]
,impl<ST>(_sock, _queue)// 3
^
source.cpp:29:4: warning: when initialized here [-Wreorder]
socket(io_service &ios)
^

проблемный участок обозначен циферками.

подскажите, как победить? (ну, кроме способа, добавления в impl функции члена init())

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: наследование реализации и порядок инициализации мемберов & базового класса
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.04.13 11:19
Оценка:
насколько я понял, это решение моего случая?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: наследование реализации и порядок инициализации мемберов & базового класса
От: watch-maker  
Дата: 09.04.13 11:21
Оценка: 19 (2)
Здравствуйте, niXman, Вы писали:

X>подскажите, как победить?


Множественное наследование:
struct Foo {
   socket_type _sock;
   queue_type _queue;
   Foo(io_service &ios): _sock(ios), _queue() {}
};

template<itype ST>
struct socket: public Foo, impl<ST> 
...
Re[2]: наследование реализации и порядок инициализации мемберов & базового класс
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.04.13 11:50
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Множественное наследование:

WM>
WM>struct Foo {
WM>   socket_type _sock;
WM>   queue_type _queue;
WM>   Foo(io_service &ios): _sock(ios), _queue() {}
WM>};

WM>template<itype ST>
WM>struct socket: public Foo, impl<ST> 
WM>...
WM>


ну да, вы правы.
спасибо, вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: [offtop] наследование реализации и порядок инициализации...
От: rg45 СССР  
Дата: 10.04.13 06:00
Оценка:
Здравствуйте, niXman, Вы писали:

X>снова приветствую!

X>пытаюсь замутить такую штуковину:
X>...
X>но компилятор говорит:
X>

X>source.cpp: In instantiation of 'socket<ST>::socket(io_service&) [with itype ST = (itype)0]':
X>source.cpp:42:31: required from here
X>source.cpp:36:15: warning: 'socket<(itype)0>::_queue' will be initialized after [-Wreorder]
X> queue_type _queue;
X> ^
X>source.cpp:32:30: warning: base 'impl<(itype)0>' [-Wreorder]
X> ,impl<ST>(_sock, _queue)// 3
X> ^
X>source.cpp:29:4: warning: when initialized here [-Wreorder]
X> socket(io_service &ios)
X> ^

X>проблемный участок обозначен циферками.
X>подскажите, как победить? (ну, кроме способа, добавления в impl функции члена init())



Не лучше ли будет в этом случае просто переместить совместно используемые члены из производного класса в базовый?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: [offtop] наследование реализации и порядок инициализации...
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.04.13 06:13
Оценка:
Здравствуйте, rg45, Вы писали:

R>Не лучше ли будет в этом случае просто переместить совместно используемые члены из производного класса в базовый?

так уже предложили же этот способ.
или о чем речь?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: [offtop] наследование реализации и порядок инициализации...
От: rg45 СССР  
Дата: 10.04.13 06:48
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, rg45, Вы писали:


R>>Не лучше ли будет в этом случае просто переместить совместно используемые члены из производного класса в базовый?

X>так уже предложили же этот способ.
X>или о чем речь?

Без множественного наследования, непосредственно в impl.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: [offtop] наследование реализации и порядок инициализации...
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.04.13 07:18
Оценка:
Здравствуйте, rg45, Вы писали:

R>Без множественного наследования, непосредственно в impl.

просто я привел неполный пример.
дело в том, что impl тут не единственный предок.

таким образом, общие данные я вывел в отдельный базовый класс, и передаю их еще двум impl, в которых реализованы алгоритмы.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: [offtop] наследование реализации и порядок инициализации...
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.04.13 07:23
Оценка:
и да, boost::base_from_member — для этого и создан.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.