我正在制作一个基于文本的RPG游戏,但我不断收到"cannot call member function 'void monster::monsterDamage()' without objec



我正在制作一款基于文本的RPG游戏,但我不断收到cannot call member function 'void monster::monsterDamage()' without object消息。这是我的代码:

播放器.cpp

#include "player.h"
#include "monster.h"
void player::playerGetDamage()
{
pHealth -= monster::monsterDamage();
}

怪物.cpp

#include "monster.h"
monster::monster(1)
{
mName="Rat";
mHealth=100;
mAttack=10;
mExp=50;
}
void monster::monsterGetDamage()
{
mHealth-=player::playerDamage();
}
void monster::pickMonster()
{
srand(time(NULL));
int a = rand() % 2 + 1;
if (a == 1)
{
monster(1)
}   
if (a == 2)
{
monster(2)
}   
}

我无法编译:我不能在播放器中使用mDamage.cpp也不能在怪物.cpp中使用playerDamage()。它说cannot call member function 'void monster::monsterDamage()' without object

另外,我想用pickmonster()随机选择敌人,但我不知道如何使用它。有一个例子monster::monster(1),但似乎它是错误的。

由于这是一个面向对象的程序,因此您必须创建一个怪物,然后玩家才能与之通信。这意味着不能使用以下代码:

void player::playerGetDamage()
{
pHealth -= monster::monsterDamage();
}

它不能保证存在"怪物"类的怪物对象。您可以通过在参数中传递怪物对象来确保玩家对象知道怪物的存在。

void player::playerGetDamage(const monster& aMonster)
{
//Use object
pHealth -= aMonster.monsterDamage();
}

在这个函数中,你也会在怪物类中得到相同类型的错误:

void monster::monsterGetDamage()
{
mHealth-=player::playerDamage();
}

这可以通过在参数中传递玩家对象以相同的方式进行更正,但随后您将增加类之间的依赖关系,这在将来可能会成为问题。也许是时候重新考虑你在哪里为玩家和怪物处理物品了?

我想用 pickmonster() 选择随机敌人,但我不知道如何使用它,例如 monster::monster(1),但它似乎是错误的

目前,怪物类中的 pickMonster-函数正在自身内部创建一个新的本地怪物对象。这意味着,如果一个怪物对象调用该函数,它将创建另一个怪物。我认为你想要这个功能,选择一个怪物,在怪物类之外获得你想要的行为。

正如其他人所说,你最大的问题是你不知道如何使用类及其对象。这些概念对于这个答案来说非常重要,所以我建议您查看 cmks 提到的概念;类、对象、成员函数。

延伸阅读:

  • C++类和对象 - 教程点
  • 课程 (第 1 部分) - Cplusplus

您使用的语法monster::monsterDamage(),对于static类函数是正确的。 那可能是你看到它使用的地方。 这些函数并不特别适用于任何一个怪物,而只是与一般的monster类相关联。 它们不属于类的任何单个对象。static和不的成员函数之间的一个很大区别是,static成员函数不会使用this指针调用,因此不能使用非静态数据成员或其中的this关键字。 这些对象因对象而异,并且所有对象static成员都是相同的。

static关键字在函数内部也以完全不同的方式使用(声明变量在对该函数的所有调用中都是持久的,而不是在调用函数时创建的临时变量,在返回函数时销毁)和第三种完全不同的方式在函数或类定义之外使用(声明符号仅在此源文件和#include它的文件中可见)。 欢迎来到C++,标准委员会宁愿重用现有关键字,也不愿通过保留新关键字来破坏旧代码。

如果您熟悉<iostream>库和<stdio.h>库,一个例子是标准库中有一个函数可以使它们同步,std::ios_base::sync_with_stdio()。 您不会分别在coutcincerr上调用它;只有一个函数适用于整个<iostream>库。

另一种类成员必须这样称呼:

monster foe;
player bar; // barian?
bar.mHealth -= foe.monsterDamage();

mHealth成员不是静态的,所以是玩家的生命值,而不是所有玩家的生命值。 但是,如果您跟踪游戏中所有怪物造成的所有伤害,则该计数器可能是monster类的静态成员。 不过,你如何在你的通话中确定哪个怪物正在造成伤害? 您可能希望将该信息作为参数传入,例如:

int player::playerGetDamage( monster& foe )
{
return pHealth -= foe.monsterDamage();
}

然后你用类似的东西来调用它:

if ( bar.playerGetDamage(foe) < 1 )
bar.dies();

相关内容

最新更新