LINUX.ORG.RU

Как вызвать конструктор с аргументом для члена класса?

 


0

1

Есть у меня класс Record. Одно из его свойств является объектом другого класса AttachTableData. Примерно так:

class Record
{
  ...

  protected:

   // Таблица прикрепляемых файлов
   AttachTableData attachTableData;
}

У класса AttachTableData два конструктора - конструктор без аргументов (для создания «свободного» объекта), и конструктор с аргументом типа Record (для создания привязанного к Record объекта).

То есть, объект attachTableData при создании в рамках класса Record, должен запомнить указатель на объект класса Record. Конструктор с аргументом выглядит так:

AttachTableData::AttachTableData(Record *iRecord)
{
  record=iRecord;
}

Проблема в том, что я никак не могу понять, как прописать использование AttachTableData-конструктора с аргументом в рамках класса Record. Сейчас у меня создаются объекты AttachTableData с использованием конструктора без аргумента. И соответственно, объект attachTableData не знает, какому Record он принадлежит.

Я, конечно, могу сделать метод:

AttachTableData::setRecord(Record *iRecord)

и вызывать его в конструкторе Record, передавая this. Но хотелось бы узнать о возможности вызывать вполне конкретный конструктор для члена класса.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

ParentCtor(T1 memberParam) : member(MemberCtor(memberParam))
{}

Пишу с андроида, извините за краткость ☺

Stil ★★★★★
()
class Record
{
  ...
  protected:

   // Таблица прикрепляемых файлов
   AttachTableData& attachTableData;
}



Record::Record(): attachTableData(this) {
  ...
}

aol ★★★★★
()
Ответ на: комментарий от aol

Record::Record(): attachTableData(this) {

Блин,я так и пробовал, только в *.h прописывал:

AttachTableData attachTableData(Record *iRecord);


И ничего не компилилось.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Блин,я так и пробовал

так, да не так ;))

aol ★★★★★
()
class Record
{
  ...

  protected:

   // Таблица прикрепляемых файлов
   AttachTableData attachTableData = AttachTableData(this);
}

с++11

Ower
()
Ответ на: комментарий от Ower

gcc4.9 давным давно это умеет

пащиниль.

завтра с работы попробую на 4.6, если «давно умеет», отпишусь тут. но, сдается мне.. :)

aol ★★★★★
()

О, кстати, мастера крестопараши, утолите мой праздный интерес, пожалуйста. Как кресты борются с циклом при вызове деструкторов (полагая, что деструкторы по умолчанию) в данном случае?

Deleted
()
Ответ на: комментарий от Xintrea

Блин,я так и пробовал

Это потому, что молодая луна. К ней особый бубен нужен. И разбрасывать не просто абы какие потроха, а только свежие.

И не верь тем, кто про стандарт c++ будет говорить - он тут не при чём. Ни пламени адского не даёт, ни отвара.

ziemin ★★
()
Ответ на: комментарий от aol

появилась эта фича в далеком марте 2012 года в gcc 4.7.0

Ower
()

Как вызвать конструктор с аргументом для члена класса?

:) :) :) :) Супруга углядела заголовок. Ржали полчаса. Этого члена класса аж жалко стало, и непонятно, почему топикстартер сам втолковать всё нормально члену класса не может, и понадобилось конструктора, да ещё и с аргументом вызывать. :) Прям не С++ а какие-то базары по понятиям.

По делу уже написали - AttachTableData attachTableData = AttachTableData(this);

Само всё будет вызываться как надо. В конструкторе ничего писать не надо.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Это она еще теги не рассмотрела

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Как кресты борются с циклом при вызове деструкторов (полагая, что деструкторы по умолчанию) в данном случае?

В данном случае никак не борятся. Потому что при удалении объекта AttachTableData не должен удаляться родительский объект Record. В AttachTableData хранится всего лишь указатель на родительский объект. Удаляется AttachTableData - ну и фиг с ним, это не значит, что нужно удалять Record.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

> Record::Record(): attachTableData(this) {
Блин,я так и пробовал, только в *.h прописывал:

Потому что это не часть прототипа (объявления) функции, а часть имплементации. Поэтому эта конструкция пишется там, где ты описываешь имплементацию функции (в смысле блок {...}). А в заголовке ты небось пишешь только прототипы.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Deleted

А в деструкторе одного из полей вызывается вызвавший деструктор.

Позволю поинтересоваться, а зачем вызывать деструктор явно? Компилятор сам обеспечивает правильное уничтожение всех объектов, зачем ему мешать?

И еще нескромный вопрос: Вы из какой вселенной на каком языке программируете? Мне просто интересно где деструкторы вызывают явно.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Позволю поинтересоваться, а зачем вызывать деструктор явно?

При чем тут вообще явные вызовы?

Компилятор сам обеспечивает правильное уничтожение всех объектов

C++

Я бы на твоем месте не был так оптимистичен.

Впрочем, я уже вычитал, что дефолтный деструктор не вызывает деструктор самого объекта по указателю.

Deleted
()
Ответ на: комментарий от Deleted

C++
Я бы на твоем месте не был так оптимистичен.

При чем здесь оптимизм? Есть вполне однозначная логика, и сколько угодно подтверждений на практике.

дефолтный деструктор не вызывает деструктор самого объекта по указателю.

Всё правильно.

Kroz ★★★★★
()
Ответ на: комментарий от Deleted

Нет. По ссылкам и указателям ничего не вызывается, естественно лол.

jeuta ★★★★
()
Ответ на: комментарий от Deleted

Ты думаешь, другие языки с ручным управлением памятью сильно отличаются в этих аспектах?

jeuta ★★★★
()
Ответ на: комментарий от Deleted

В шести процентах:

12.4/15 — Destructors

Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended (3.8). [ Example: if the destructor for an automatic object is explicitly invoked, and the block is subsequently left in a manner that would ordinarily invoke implicit destruction of the object, the behavior is undefined. — end example ]

При входе в деструктор объекта уже не существует, поэтому повторный вызов деструктора — это undefined behavior, за которым компилятор не обязан следить.

ilammy ★★★
()
Ответ на: комментарий от Deleted

Ты нестареющий *банат. Это так мило :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.