Ссылка на вложенный класс
От: TailWind  
Дата: 23.08.19 04:55
Оценка:
Извините за детский вопрос
Не смог найти в Google

Проблема в том, что вектором не удобно пользоваться по указателю, из-за оператора []
Хочется иметь ссылку
Но с ней проблема:

//---------------------------------------------------------------------------
class A
{
  public:
    A(vector<ULONG> &v_) : v(v_) 
    {
      // Есть ли гарантия, что вектор уже сконструирован полностью?
    }
  private:
    vector<ULONG> &v;
};
//---------------------------------------------------------------------------
class B
{
  public:
    B() : a(v)
    {
      // можно ли так делать?
    }
  private:
    vector<ULONG> v;
    //
    A a;
};
//---------------------------------------------------------------------------
Re: Ссылка на вложенный класс
От: Vamp Россия  
Дата: 23.08.19 05:51
Оценка: 6 (1) +2
Ссылка или указатель — не важно. Важно, что базовый класс будет сконструирован до того, как сконструированы члены класса-потомка. Ссылку или указатель на такой несконструированный член сформировать можно, но обращаться к ней в конструкторе базового класса нельзя.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Ссылка на вложенный класс
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.08.19 07:09
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Ссылка или указатель — не важно. Важно, что базовый класс будет сконструирован до того, как сконструированы члены класса-потомка. Ссылку или указатель на такой несконструированный член сформировать можно, но обращаться к ней в конструкторе базового класса нельзя.


но тут нет базового класса.
Слово "совпадение" появилось после падения сов.
Re: Ссылка на вложенный класс
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.08.19 07:11
Оценка: +3
Здравствуйте, TailWind, Вы писали:

да, можно.

в B сначала будет создан вектор, а потом A с ссылкой на вектор.
Слово "совпадение" появилось после падения сов.
Re: Ссылка на вложенный класс
От: Chorkov Россия  
Дата: 23.08.19 07:15
Оценка: 1 (1) +1
Здравствуйте, TailWind, Вы писали:

TW>Извините за детский вопрос

TW>Не смог найти в Google

TW>Проблема в том, что вектором не удобно пользоваться по указателю, из-за оператора []

TW>Хочется иметь ссылку
TW>Но с ней проблема:

TW>
TW>//---------------------------------------------------------------------------
TW>class A
TW>{
TW>  public:
TW>    A(vector<ULONG> &v_) : v(v_) 
TW>    {
TW>      // Есть ли гарантия, что вектор уже сконструирован полностью?
TW>    }
TW>  private:
TW>    vector<ULONG> &v;
TW>};
TW>//---------------------------------------------------------------------------
TW>




Члены класса инициализируются в порядке объявления.
Т.е. так делать можно:
class B
{
  public:
    B() : a(v)   // эквивалентно: B() : v(), a(v)
    {}           // В момент вызова a(v), член v уже сконструирован
  private:
    vector<ULONG> v;
    A a;
};


А так делать нельзя:
class B
{
  public:
    B() : a(v)   // эквивалентно B() : a(v), v()
    {}
  private:
    A a;
    vector<ULONG> v;
};


Вообще потенциально опасный код, из-за того что крректность поведения определеяется кодом "удаленным" от точки использования.
Кто-то без злого умысла может потом переупорядочить приватные члены, в рамках рефеакторинга.
Re[3]: Ссылка на вложенный класс
От: Vamp Россия  
Дата: 23.08.19 16:09
Оценка:
X>но тут нет базового класса.

Бес попутал. Мне казалось, что А — предок. Не знаю как я код смотрел.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Ссылка на вложенный класс
От: TailWind  
Дата: 23.08.19 20:48
Оценка:
V>Бес попутал. Мне казалось, что А — предок. Не знаю как я код смотрел.
Да не важно
Главное смысл понятен
В конструкторе не использовать
В остальных местах можно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.