类函数是否具有不同类对象的参数?

时间:2016-06-25 04:26:45

标签: c++ function class object parameters

我们说我有2个班级,玩家和npc。在类播放器的头文件中,我可以使用一个具有npc类对象作为参数的函数吗?

例如:

player.h:

void somefunc(npc npc1);

2 个答案:

答案 0 :(得分:2)

是的,这是允许的,只要遇到该类型的定义或前向声明。你也可以有其他类型的指针或引用,甚至是同一类的参数。类型。

class A {};

class B {
  public:
    void funcA(A a) {}
    void funcAPtr(A* p) {}
    void funcARef(A& r) {}

    void funcB(B b) {}
};

// ...

A a;
B b;
b.funcA(a);

这实际上是面向对象编程的关键原则之一。

在具体情况下,您可能希望首先定义npc,因此它看起来像这样:

// npc.h
class npc {};

// -----

// player.h
#include "npc.h"

class player {
  public:
    void somefunc(npc npc1);
};

或者,如果您在.cpp文件中有函数体,则可以在标头中放置一个前向声明,并在源文件中包含npc.h。这通常更安全,特别是在您可能遇到循环依赖问题的情况下。

// npc.h
class npc {};

// -----

// player.h
class npc;

class player {
  public:
    void somefunc(npc npc1);
};

// -----

// player.cpp
#include "player.h"
#include "npc.h"

void player::somefunc(npc npc1) {}
// Note that "npc"'s header must be included before the type is actually used.
// For example, it needs to be included before the function's body, even though a
// forward declaration is enough for the function's prototype to work properly.

答案 1 :(得分:1)

是的,这是完全可能的,我想添加的一件事是,接收参数作为指向该类对象的指针通常是一件好事,因为你并不总是希望复制一个内存中的整个对象。

除此之外,您可以(并且应该根据具体情况)将参数作为指向const对象的指针,以便该方法可以从对象访问它所需的任何内容,而无需复制它并且无需修改它的成员。