Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ вопрос про c++

Автор: kilkinenator 28.9.2010, 12:55

итак, есть кусочек кода, тупо срисованый с примера буста:

   
Server::Server(unsigned short port, int threads) :
    mIOServicePool(threads),
    mAcceptor(mIOServicePool.GetIOService(), ip::tcp::endpoint(ip::tcp::v4(), port))
{
    mAcceptor.set_option(ip::tcp::acceptor::reuse_address(true));
}

а проблема моя в том что mIOServicePool.GetIOService() происходит раньше чем mIOServicePool(threads), понятно, что такой расклад неприятен))

З.Ы. я понимаю, что есть простые решения моей проблемы, но очень хочется разобраться что да почему


Автор: Алексей1153 28.9.2010, 12:59

вообще -то, из контекста просто очевидно, что mIOServicePool и mAcceptor - это члены класса (так как в списке инициализаторов). Насчёт порядка - щас лень проверять, но вроде в каком порядке члены в списке указаны, такая последовательность и будет. Но, если ошибаюсь, тебе поможет простая перестановка местами:

Server::Server(unsigned short port, int threads) :
    mAcceptor(mIOServicePool.GetIOService(), ip::tcp::endpoint(ip::tcp::v4(), port)), //<<<<<
    mIOServicePool(threads) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
    mAcceptor.set_option(ip::tcp::acceptor::reuse_address(true));
}


Автор: kilkinenator 28.9.2010, 13:08

Цитата(Алексей1153 @ 28.9.2010, 13:59) *
Но, если ошибаюсь, тебе поможет простая перестановка местами:

Server::Server(unsigned short port, int threads) :
    mAcceptor(mIOServicePool.GetIOService(), ip::tcp::endpoint(ip::tcp::v4(), port)), //<<<<<
    mIOServicePool(threads) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
    mAcceptor.set_option(ip::tcp::acceptor::reuse_address(true));
}


нее, совсем не то))

Цитата(Алексей1153 @ 28.9.2010, 13:59) *
Насчёт порядка - щас лень проверять, но вроде в каком порядке члены в списке указаны, такая последовательность и будет.


вот это скорее всего так, так как изменение порядка и помогло мне. спасибо)

Автор: kwisp 28.9.2010, 15:00

Цитата(kilkinenator @ 28.9.2010, 13:55) *
а проблема моя в том что mIOServicePool.GetIOService() происходит раньше чем mIOServicePool(threads), понятно, что такой расклад неприятен))

по-моему, в каком порядке в обЪявлении класса члены идут в том порядке и инициализируются.

Автор: Sokoloff 28.9.2010, 16:47

Цитата(kwisp @ 28.9.2010, 16:00) *
Цитата(kilkinenator @ 28.9.2010, 13:55) *
а проблема моя в том что mIOServicePool.GetIOService() происходит раньше чем mIOServicePool(threads), понятно, что такой расклад неприятен))

по-моему, в каком порядке в обЪявлении класса члены идут в том порядке и инициализируются.

Да, это так, хотя это не очевидное поведение. Вот что http://www.cyberguru.ru/programming/cpp/cpp-language-straustrup3-page24.html Страуструп:
Цитата(Бьерн Страуструп)
Списки параметров для членов отделяются друг от друга запятыми (а не двоеточиями), а список инициализаторов для членов можно задавать в произвольном порядке:
           classdef::classdef(int size)
               : friends(size), members(size), no_of_members(size)
           {
             // ...
           }
Конструкторы вызываются в том порядке, в котором они заданы в описании класса.


Автор: igor_bogomolov 28.9.2010, 18:36

http://habrahabr.ru/blogs/cpp/58818/

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)