Я переезжаю на C ++ из Java, и у меня много проблем с пониманием основ работы классов C ++ и передовых методов их проектирования. В частности, мне интересно, должен ли я использовать указатель на моего члена класса в следующем случае.
У меня есть пользовательский класс Foo, который представляет состояние игры на конкретном ходу, а Foo имеет переменную-член пользовательского класса Bar, которая представляет логическое подмножество этого игрового состояния. Например, Foo представляет шахматную доску, а Bar представляет фигуры под атакой и их ходы побега (не мой конкретный случай, а более универсальная аналогия, я думаю).
Я бы хотел найти последовательность ходов, скопировав Foo и соответственно обновив состояние копии. Когда я закончу поиск этой последовательности ходов, я откажусь от этой копии и у меня останется исходный Foo, представляющий текущее состояние игры.
В Foo.h я объявляю свой класс Foo и объявляю переменную-член для него типа Bar:
class Foo {
Bar b;
public:
Foo();
Foo(const Foo& f);
}
Но при реализации моих конструкторов Foo я вызываю конструктор Bar с некоторыми аргументами, специфичными для текущего состояния, которые я буду знать во время выполнения. Насколько я понимаю, это означает, что конструктор Bar вызывается дважды - один раз, потому что я написал "Bar b;" выше (который вызывает конструктор по умолчанию, если я правильно понимаю), и один раз, потому что я пишу что-то вроде «b = Bar (arg1, arg2, ...)» в Foo :: Foo () и Foo :: Foo (const Foo & е).
Если я пытаюсь сделать как можно больше копий Foo в секунду, это проблема, верно?
Я думаю, что простое решение состоит в том, чтобы вместо этого объявить указатель на Bar: "Bar * b", который должен избегать создания экземпляра b дважды. Это хорошая практика? Это подводные камни, о которых я должен знать? Есть ли лучшее решение? Я не могу найти конкретный пример, чтобы помочь мне (кроме большого количества предупреждений против использования указателей), и вся информация о разработке классов действительно ошеломляющая, поэтому любые рекомендации будут с благодарностью!
РЕДАКТИРОВАТЬ: Да, у меня будет вся информация, необходимая для создания Bar, когда я создаю свой Foo. Я думаю, что все поняли это, но чтобы прояснить это, у меня уже есть нечто подобное для моего конструктора по умолчанию:
Foo(int k=5);
и в Foo.cpp:
Foo::Foo(int k) {
b = Bar(k);
...
}
и затем мой Foo и его член Bar обновляются постепенно по мере изменения состояния игры.
Поэтому вызов моего пользовательского конструктора Bar в моем конструкторе Foo * объявление 1026 * список инициализации выглядит как лучший способ сделать это. Спасибо за ответы!