C++ 返回方法中对象的名称

C++ 返回方法中对象的名称,c++,C++,我对编码相当陌生,我正在学习这本法语教程,它基本上是制作一个通过控制台使用的RPG游戏 因此,我在一个.cpp文件和.h中获得了一个字符类,另一个.h.cpp武器的两个文件,以及我的主文件 我的CPP文件中有一个函数如下: void Character::attack(Character &target) { target.takeDamage(m_weapon.getDamage()); } 到目前为止,在《理解》中,我将以这种方式使用它:davids.attac

我对编码相当陌生,我正在学习这本法语教程,它基本上是制作一个通过控制台使用的RPG游戏

因此,我在一个
.cpp
文件和
.h
中获得了一个字符类,另一个
.h
.cpp
武器的两个文件,以及我的主文件

我的CPP文件中有一个函数如下:

void Character::attack(Character &target)
{
    target.takeDamage(m_weapon.getDamage());
     
}
到目前为止,在《理解》中,我将以这种方式使用它:
davids.attack(歌利亚)
,我制作了一个别名,这样我就可以轻松地使用目标的
takeDamage
功能

但我想在该函数中添加一个控制台行,如
David攻击了歌利亚并造成了X点伤害。
看起来我不能调用像这样的函数

string Character::getname 
{return name}
由于我使用了两个不同的字符


有没有办法绕过这个问题,或者我应该给它们都取一个别名?

假设字符类有类似于
name
的字段,您可以使用
this->name
访问方法中的字段(它将访问调用该方法的对象的名称,在本例中是David),而
target.name
将是“Goliath”

#include <iostream>
#include <string>
#include <string_view>

template <typename Derived>
class Character{
    static constexpr std::string_view CName = "Character";

public:
    constexpr const std::string_view& getName() { return Derived::CName; }

    template<typename K>
    void Attack(Character<K>& Target) {
        std::cout << getName() << " attacked " << Target.getName() << "\n";
    }
};

class David : public Character<David>{
    public:

    static constexpr std::string_view CName = "David";
};

class Goliath : public Character<Goliath>{
    public:
    static constexpr std::string_view CName = "Goliath";
};

int main(int a, char** argv){

    David d;
    Goliath g;

    d.Attack(g);

    return 0;
}
#包括
#包括
#包括
模板
类字符{
静态constexpr std::string_view CName=“Character”;
公众:
constexpr const std::string_view&getName(){返回派生的::CName;}
模板
无效攻击(角色和目标){

如果您可以使用C++17,我建议您使用CRTP

#include <iostream>
#include <string>
#include <string_view>

template <typename Derived>
class Character{
    static constexpr std::string_view CName = "Character";

public:
    constexpr const std::string_view& getName() { return Derived::CName; }

    template<typename K>
    void Attack(Character<K>& Target) {
        std::cout << getName() << " attacked " << Target.getName() << "\n";
    }
};

class David : public Character<David>{
    public:

    static constexpr std::string_view CName = "David";
};

class Goliath : public Character<Goliath>{
    public:
    static constexpr std::string_view CName = "Goliath";
};

int main(int a, char** argv){

    David d;
    Goliath g;

    d.Attack(g);

    return 0;
}
#包括
#包括
#包括
模板
类字符{
静态constexpr std::string_view CName=“Character”;
公众:
constexpr const std::string_view&getName(){返回派生的::CName;}
模板
无效攻击(角色和目标){


std::不值得一提的是,这也是您调用方法的方式。因为OP提到有一个getter
getName
,所以您可以执行
this->getName()
target.getName()
。这是一个很好的观点,我没有注意到问题的关键。谢谢你的回答!谢谢!我还有很多其他的错误要解决,但这可能是一个好的方向!可能在其他地方失败了,因为
cout@Beebedibooh试图通过编写小块代码来避免一次出现多个错误。写几行,只要有一件东西可以测试就足够了。编译它并解决所有错误和警告。测试它。当你得到你想要的行为时(没有其他“有时”行为),您将继续下几行代码。有了几行代码,您将不会有太多错误,而且它们很可能位于您刚才添加的代码行中,从而使查找它们变得非常容易。如果您让bug堆积起来,它们会聚集在您身上,并且变得非常、非常难以解决。值得一提的是,这也是您调用方法的方式。因为OP提到有了getter
getName
,您可以执行
this->getName()
target.getName()
。这是一个很好的观点,我没有注意到问题的关键。谢谢你的回答!谢谢!我还有很多其他的错误要解决,但这可能是一个好的方向!可能在其他地方失败了,因为
cout@Beebedibooh试图通过编写小块代码来避免一次出现多个错误。写几行,只要有一件东西可以测试就足够了。编译它并解决所有错误和警告。测试它。当你得到你想要的行为时(没有其他“有时”行为),您将继续下几行代码。有了几行代码,您就不会有太多错误,而且它们最有可能出现在您刚才添加的代码行中,这使得查找它们变得非常容易。如果您让bug堆积起来,它们会聚集在您身上,并且变得越来越难解决。这似乎是相当严重的过度使用。我们为什么要
David
Goliath
是完全独立的类,而不是单个
字符
类的不同实例?这里至少有两个优化点,类占用空间小,没有虚拟调用。这比虚拟调用的使用范围小,但如果可用,将产生更好的性能。首先,考虑到代码根本无法运行,尝试以更复杂但可能更高性能的方式重写它似乎为时过早。其次,要替换哪些虚拟调用?据我所知,除了您之外,没有人提出过任何类型的继承。我给出了一个替代答案,不仅是针对请求者(Beebedibooh)但对于可能遇到的人来说,这个解决方案可能符合他们的要求。@BalanNarcis:谢谢你的建议,但由于我对编码相当陌生,我不确定我是否理解你的建议。我应该制作另一个基本上是我的副本的类,但具有公共属性?这似乎有相当大的过度。为什么我们甚至希望
David
Goliath
是完全独立的类,而不是单个
字符
类的不同实例?这里至少有两个优化点,类占用空间小,没有虚拟调用。这比虚拟调用的使用范围小,但如果可用,将产生b更好的性能。首先,考虑到代码根本不起作用,尝试以更复杂但可能更高性能的方式重写它似乎为时过早。其次,要替换哪些虚拟调用?据我所知,除了你之外,没有人提出过任何继承。我给出了一个替代答案,不仅仅是针对请求者(Beebedibooh)但对于可能遇到的人来说,此解决方案可能符合他们的要求