C ++ Установить элемент объекта в качестве ссылки / указателя на член другого объекта? - PullRequest
0 голосов
/ 28 июля 2010

(я не уверен, правильно ли сформулирован этот заголовок, так как я все еще новичок в C ++)

У меня есть два класса, которые здесь представлены свободно:

class SuperGroup
{
public:
    LayoutObj theLayout;
}

class SomeClass
{
public:
    LayoutObj myLayout;
    SuperGroup myGroup;
}

Во времяКонструктор SomeClass, я хочу установить myGroup.theLayout, чтобы он указывал на SomeClass s searchLayout.Примерно так:

SomeClass::SomeClass()
{
    myGroup.theLayout = &myLayout;
}

Я правильно это делаю?Или мне нужно использовать указатель?Кажется, мой код компилируется нормально, но когда я его выполняю, он падает, и я могу сказать, что это как-то связано с этим назначением.Кроме того, я не уверен, что он неправильно закодирован или просто не нравится используемый мной SDK / API.

Причина, по которой я пытаюсь сослаться на myLayout с SuperGroupпотому что у меня есть много методов в SuperGroup, которые должны использовать myLayout из SomeClass.Я просто пытаюсь избежать передачи myLayout по ссылке на эти методы каждый раз.Есть смысл?Есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 28 июля 2010

Вам действительно нужен указатель.Попробуйте использовать:

LayoutObj *theLayout;

Без указателя вы пытаетесь присвоить LayoutObj адресу памяти.Это может компилироваться, но это не то поведение, которое вам нужно.Вместо этого вам нужен указатель, указывающий на адрес памяти LayoutObj.

Строка myGroup.theLayout = &myLayout; остается прежней.

Как всегда в случае с C ++, будьте осторожны, чтобыmyLayout не выходит за рамки ранее theLayout.Если это произойдет, у вас есть свисающий указатель.Если есть какой-либо риск, подумайте об использовании какого-либо умного указателя или иным образом измените свой дизайн, чтобы приспособиться к этому.

0 голосов
/ 28 июля 2010

Да, вам нужно будет использовать указатель: LayoutObj *theLayout;

В отношении вашего последнего абзаца я бы рассмотрел некоторые альтернативные варианты, такие как:

  • Требование, чтобы LayoutObj передавалось в каждый метод SuperGroup, поэтому, отделяя конкретное действие LayoutObj, от которого можно выполнить действия, или
  • Перемещение этих методов в SomeClass, еслине нужны в другом месте, или
  • Создание их методами самого LayoutObj.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...