C ++ передача объекта в функции - PullRequest
0 голосов
/ 27 августа 2018

Вопрос:

Какой синтаксис вы используете, чтобы два объекта одного класса взаимодействовали друг с другом в своих соответствующих функциях?

У меня есть два объекта вклассный солдат.Функция класса attack (y) принимает значение current_hp int одного объекта и вычитает значение atk int другого объекта.Я не могу передать имена объектов через аргументы, подобные этому.Очевидно, это не работает, и ссылки далее в коде также не будут работать.

Справочная информация:

Я проходил онлайн-уроки и наткнулся навызов, который должен соответствовать урокам, которые я получил.Я сделал это без проблем, но я вернулся и переписал это с учетом функций и классов.

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

class soldier{
private:
    int curent_hp = 0;
    int atk = 0;
    int init = 0;
public:
    bool attacked_yet = false;
    void create_soldier(){
        curent_hp = rand() % 20 + 1;
        atk = rand() % 5 + 1;
        init = rand() % 100 + 1;
    }
       int attack(y){
 // the y here being the one that is being attacked
        int attackroll = rand() % 100 + 1;
        if (attackroll < 30){
            y.curent_hp = y.curent_hp - atk;
            }
    }
};

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Какой синтаксис вы используете, чтобы два объекта одного класса взаимодействовали друг с другом в своих соответствующих функциях?

и из Google 'синтаксис' определяется как

... расположение слов и фраз для создания правильно сформированных предложений в языке.

В этом контексте я не уверен, что вы подразумеваете под синтаксисом.


В качестве отправной точки и кое-что, о чем писать,

  • во встроенных системах связи, я имел дело с парами работа / защита, все в C ++.

аппаратный контекст:

  • Почти вся работа / защита hw заменяемая ... было нормально просто поменять местами слоты для карт.

Контекст программного обеспечения:

  • Карты работы и защиты были "... двумя объектами одного класса."

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


Работа / защита имеет значение для ctor:

a) Обе карты построены безпредположения о присутствии другого.

Примечание: если другой никогда не установлен, система все равно будет работать, только без поведения 'recovery'.

Примерно так же, как два солдата никогда не сражались бы, если существовал только 1 из них.

b) Когда код контроллера готов создать второе (из пары), он знает, чтоПервая карта работы / защиты готова.Он просто создает вторую, а затем передает ссылку на последнюю конструкцию о первом родственнике.

c) При получении ссылки на родного брата второй объект из двух обновит оба экземпляра.Я обычно давал ссылку на вторую карту сразу после завершения ctor второй карты (без ошибок).

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


Я также участвовал в усилиях по симуляции битвы (до телекомма).

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

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


Во время боевого сима, над которым я работал некоторое время назад, все действия сима стимулировались огнем оружия (и, в этом случае, лазерным сигналом).Расстояние и тип оружия (танк против ар15) влияли на летальность при попадании (как обнаруживается лазерным датчиком).

Это программное обеспечение было значительно упрощено, потому что каждый участник (и узел в симе) был и оружием, и целью.

Удачи в ваших усилиях.


Вероятно, последний комментарий:

Я обычно не передаю объекты в функции.Вместо этого я вызываю функции объектов.Есть много статей по этому вопросу.Я могу порекомендовать:

см .: https://pragprog.com/articles/tell-dont-ask

см. Также: https://martinfowler.com/bliki/TellDontAsk.html Tell-Don't-Ask - это принцип, который помогает людям вспомнить, что объектная ориентация связана ссвязывание данных с функциями, которые работают на этом ... Мартин Фаулер

0 голосов
/ 27 августа 2018

Вам нужно передать ссылку атакованному солдату, например:

/** Attack a target soldier
@param[in] target soldier to be attacked
*/
int attack( soldier& target )
{
  ...

Кстати, не используйте имена параметров, такие как y, если вы не работаете надгеометрические задачи с координатами x, y и z.Значимые имена параметров избавляют от горя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...