crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> вопрос про c++, порядок выполнения конструктора
kilkinenator
  опции профиля:
сообщение 28.9.2010, 12:55
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 11.2.2010
Пользователь №: 1464

Спасибо сказали: 3 раз(а)




Репутация:   1  


итак, есть кусочек кода, тупо срисованый с примера буста:
   
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
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вообще -то, из контекста просто очевидно, что 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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 11.2.2010
Пользователь №: 1464

Спасибо сказали: 3 раз(а)




Репутация:   1  


Цитата(Алексей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
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


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

по-моему, в каком порядке в обЪявлении класса члены идут в том порядке и инициализируются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 28.9.2010, 16:47
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


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

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

Да, это так, хотя это не очевидное поведение. Вот что пишет Страуструп:
Цитата(Бьерн Страуструп)
Списки параметров для членов отделяются друг от друга запятыми (а не двоеточиями), а список инициализаторов для членов можно задавать в произвольном порядке:
           classdef::classdef(int size)
               : friends(size), members(size), no_of_members(size)
           {
             // ...
           }
Конструкторы вызываются в том порядке, в котором они заданы в описании класса.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 28.9.2010, 18:36
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Порядок инициализации в конструкторах
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 0:43