尝试将类作为参数传递给不同的类构造函数,但收到"conversion"错误

Trying to pass class as parameter to a different class constructor, but am getting "conversion" error

本文关键字:构造函数 错误 conversion 参数传递      更新时间:2023-10-16

所以我试图将一个类作为参数传递给另一个类(在不同的标头中),并不断收到我似乎无法调试的错误。

错误:

'wanderingSoul::wanderingSoul

(wanderingSoul &&)':无法将参数 1 从 'player' 转换为 'const wanderingSoul &'

主要问题在于游戏.cpp文件,在"//战斗测试"下面,我称之为"流浪灵魂漫游S(main)"。

'player'是一个类,流浪的灵魂也是一个,我不明白的是如何正确传递/引用玩家类,因为它在传递到函数时运行良好,但不适用于这个类构造函数。

  • 游戏.cpp
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include "player.h"
#include "npc.h"
#include "enemy.h"
#include "map.h"
#include "items.h"
#include "dialog.h"
/* To Do List
* Multiple chars per battle if in party.
* Add inventory & powers
* Add battles
* Finish "story" & dialogues
* Make map
* Add dialog trees (instead of if/else & switch/case)
* Add relation between characters using weighted graph
*/
void battle(player plyr, enemy nme)
{
std::cout << "You have entered a battle with " << nme.name << std::endl;
while (!plyr.dead() && !nme.dead())
{
}
}
int roll()
{
return rand() % 12 + 1;
}
int main()
{
srand(time(NULL));
std::string playerName;
char optionChoice;
int dialogChoice;
npc Lexa("Lexa", 80, 80);
BEGIN_GAME:
system("cls");
std::cout << Lexa.nameText() << "Hey... Hey, are you awake now?" << std::endl;
std::cout
<< Lexa.nameText() 
<< "I was starting to get worried. You've been out for quite some time. Do you remember your name?" 
<< std::endl;
INSERT_NAME:
std::cout << "(Name): ";
std::cin >> playerName;
std::cout << Lexa.nameText() << "Huh. " << playerName << ". Is that right? (y/n)" << std::endl;
std::cin >> optionChoice;
if (optionChoice != 'y' && optionChoice != 'Y')
{
//system("cls");
std::cout << Lexa.nameText() << "Please try to remember, I need to make sure you're stable. " << std::endl;
goto INSERT_NAME;
}
player main(playerName);
INTRODUCTION:
system("cls");
//Print location
initInfo(main, Lexa);
//BATTLE TEST
wanderingSoul wanderS(main);
battle(main, wanderS.ws);
//TRAVEL TEST
system("pause");
return 0;
}
  • 敌人。
#pragma once
#include <vector>
#include "powers.h"
#include "items.h"
#include "player.h"
//Need to include map?
class enemy
{
private:
/**Stat Properties*********
* Health: 0->100
*     0 = Death/GameOver
* Level: 1->100
* Attack: 1->10
* Defense: 1->10
* Mana: 0->100
* Affiliation: -100->100
**************************/
/*
* Add inventory
*      -list of pointers to inventory items
* Add powers
*      -list of pointers to powers
*/
class currPowers //Keeps track of current powers have
{
private:
public:
};
public:
unsigned int health, level, attackPWR, defensePWR, mana;
int affiliation;
std::string name;
enemy()
{
health = 100;
level = 1;
attackPWR = 1;
defensePWR = 1;
mana = 100;
affiliation = 0;
}
enemy(std::string t_name)
{
name = t_name;
health = 100;
level = 1;
attackPWR = 1;
defensePWR = 1;
mana = 100;
affiliation = 0;
}
/*
void attack(player plyr, power pwr)
{
}
*/
void defend()
{
}
bool dead()
{
if (health == 0 || level == 0)
{
if (level == 0)
{
std::cout << name << " had a heart attack." << std::endl;
}
else
{
std::cout << name << " has been defeated. Hoorah!" << std::endl;
}
return true;
}
return false;
}
std::string nameText()
{
return name + ": ";
}
};
/* ENEMY LIST
*        STD/COMMON
* Wandering Soul
* Red Royal Soldier
* Wolf (Pack)
* B.A.R
* Disciples
*        UNCOMMON
* Tech Soldier
* Banished Mage
* Tech Hound
* Dark Mage
*        RARE
* Cyber Cyclops
* Hellhound
* Elite Androids
* Follower of The Void
* Banshee
*        BOSS
* Mantis
* Mary S.
* The Summoner
* NOX-322
* The Void
*/
class wanderingSoul
{
public:
/*
Name: Wandering Soul
Health: 75/100
Level: |player level| - 1, level > 0.
Attack:
Defense:
Mana:
Affiliation:
Powers:
*/
enemy ws;
int diceRoll;
wanderingSoul(player plyr)
{
ws.name = "Wandering Soul";
diceRoll = roll(); //Rolling for health
if (diceRoll == 0)
{
ws.health = 50;
}
else  if (diceRoll > 6)
{
ws.health = 100;
}
else
{
ws.level = 75;
}
diceRoll = roll(); //Rolling for level
if (diceRoll == 0)
{
ws.level = plyr.level - 1;
}
else  if (diceRoll > 6)
{
ws.level = plyr.level + 1;
}
else
{
ws.level = plyr.level;
}
}
};
  • 玩家.h
#pragma once
#include <vector>
#include "powers.h"
#include "items.h"
#include "enemy.h"
//Need to include map?
class player
{
private:
/**Stat Properties*********
* Health: 0->100
*     0 = Death/GameOver
* Level: 1->100
* Attack: 1->10
* Defense: 1->10
* Mana: 0->100
* Affiliation: -100->100
**************************/
//Setting everything outside private for now due to needing to access variables in other classes.
/*
* Add inventory
*      -list of pointers to inventory items
* Add powers
*      -list of pointers to powers
*/
class currPowers //Keeps track of current powers have
{
private:
public:
};
public:
unsigned int health, level, attackPWR, defensePWR, mana;
int affiliation;
std::string name;
player(std::string t_name)
{
name = t_name;
health = 100;
level = 1;
attackPWR = 1;
defensePWR = 1;
mana = 100;
affiliation = 0;
}
void incAffiliation(bool x)
{
if (x == true)
{
affiliation += 5;
}
else
{
affiliation -= 5;
}
}
void attack(enemy nme, power pwr)
{
}
void defend()
{
}
bool dead()
{
if (health == 0)
{
std::cout << "You are dead." << std::endl;
return true;
}
return false;
}
std::string nameText()
{
return name + ": ";
}
};

抱歉,如果代码不好,有很多不需要的行,我打算尽快清理它,但想看看我是否可以与主角和敌人进行战斗,尽管我无法说出问题所在。我尝试将玩家(主要角色)类作为参数传递的原因是因为我是将敌人的统计数据基于玩家的统计数据,而且我不是最好的指针和去引用的东西,所以这很可能是一个问题...... 无论如何,很抱歉代码太长了,但这是我第一次尝试通过 C++ 制作小游戏并尝试学习新事物。(嗯,我知道类和结构,但这是我第一次将 c++ 用于非学校/非数据结构实现工作)

更新:删除了游戏.cpp混乱的部分,并看到问题是"语法错误:inditifier'player'",所以我正在尝试了解如何解决这个问题。

这里的问题是您在player.h中包含enemy.h,并在enemy.h中包含player.h。 然后,您将它们都包含在您的game.cpp中。循环依赖就是这种情况。 当您尝试编译未共享的代码时,肯定会有更多错误。

无论如何,您可以使用前向声明来避免此问题。

一些旁注:

由于您正在开发游戏,因此您需要了解有关继承和组合的更多信息。继承是IS-A关系的情况,另一方面,组成是HAS-A的情况。

所以这里你所做的在设计问题上是不对的,流浪的灵魂是一个敌人,所以不是在wanderingSoul阶级内部创造一个敌人,这是阶级enemy固有的。

你的敌人可以有多个小工具,这些小工具可以是另一个类,所以在这里你可以看到你有一个HAS-A的情况,你可以从组合中受益。

另一件事是,PlayerEnemy在你的游戏世界中是两个不同的东西,所以将玩家传递给敌人职业不是一个好主意。您需要一个游戏控制器类来控制这两个类的对象之间的交互,例如战斗或说话或这两个类可能执行的其他操作。