C++ 将对象传递给函数

Posted

技术标签:

【中文标题】C++ 将对象传递给函数【英文标题】:C++ passing object to functions 【发布时间】:2018-08-26 23:32:39 【问题描述】:

问题:

您使用什么语法让同一类的两个对象在各自的函数中相互交互?

我在班级士兵中有两个对象。类函数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;
            
    
;

【问题讨论】:

soldier& y,也可以考虑将其作为构造函数来代替 create_soldier。 【参考方案1】:

您需要将reference 传递给被攻击的士兵,如下所示:

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

  ...

顺便说一句,不要使用像 y 这样的参数名称,除非您正在处理 x、y 和 z 坐标的几何问题。有意义的参数名称可以省去很多麻烦!

【讨论】:

【参考方案2】:

你用什么语法让同一个类的两个对象交互 在各自的职能中相互联系?

来自 Google,“语法”定义为

... 单词和短语的排列以创建格式良好的句子 用一种语言。

在这种情况下,我不确定您所说的语法是什么意思。


作为一个起点,写一些东西,

在电信嵌入式系统中,我使用 C++ 处理工作/保护对。

硬件环境:

几乎所有工作/保护硬件都是可更换的……只需更换卡槽即可。

软件上下文:

工作卡和保护卡是“......同一类的两个对象”。

工作和保护卡由硬件合作以实现“快速”响应,软件在下一秒内发现任何动作(由硬件采取)。


工作/保护对 ctor 有影响:

a) 两张牌的构造都没有假设对方的存在。

注意:如果另一个从未安装,系统仍然可以工作,只是没有“恢复”行为。

大致类似于只有一个士兵存在时两个士兵永远不会战斗。

b) 当控制器代码准备好创建第二个(一对)时,它知道第一个工作/保护卡已准备好。它只是构造第二个,然后将引用传递给最新的构造,关于第一个兄弟。

c) 收到同级引用后,两者中的第二个对象将更新两个实例。我通常在第二张卡片 ctor 完成后立即给出第二张卡片的引用(没有错误)。

注意:在 C++ 中,同一个对象类的兄弟实例在提供引用或指针时可以完全访问另一个。


我还为战斗模拟工作做出了贡献(在电信之前)。

如果您的控制器为每个士兵提供刺激,即调用一个函数,则每个士兵可以单独进行(战斗的)进一步交互。

您还可能会发现,在接收到刺激后,当一个士兵实例对两个士兵实例执行与单个刺激相关的操作时,可能会更容易。


在我前段时间参与的战斗模拟游戏中,所有模拟动作都受到武器火力的刺激(在这种情况下,是激光信号)。距离和武器类型(坦克与 ar15)影响击中时的杀伤力(由激光传感器检测到)。

该软件大大简化了,因为每个参与者(以及 sim 中的节点)既是武器又是目标。

祝你好运。


可能是最后的评论:

我通常不会将对象传递给函数。相反,我调用对象的函数。关于这个问题有很多文章。我可以推荐:

见:https://pragprog.com/articles/tell-dont-ask

另见:https://martinfowler.com/bliki/TellDontAsk.html Tell-Don't-Ask 是一个原则,它帮助人们记住面向对象是将数据与在该对象上运行的函数捆绑在一起...... 马丁·福勒

【讨论】:

以上是关于C++ 将对象传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象传递给 innerHTML (JavaScript) 中的函数?

将对象传递给 javascript 函数

通过 const& 和 & 将对象传递给同一个函数

将对象传递给另一个类的构造函数

Vaadin 12将对象传递给JavaScript的函数:不能编码类

检测何时将对象传递给 C++ 中的新线程?