无法访问静态函数内部的私有变量

Posted

技术标签:

【中文标题】无法访问静态函数内部的私有变量【英文标题】:Unable to access private variables inside of static functions 【发布时间】:2019-03-06 03:54:36 【问题描述】:

我正在尝试制作一个小型迷你游戏,其中 class Hero 使用 class Enemyvariables 与 friend 交互,但代码无法编译并给我前向声明错误

#include <iostream>

class Enemy;

class Hero

    friend class Enemy;
private:
    static int hp, power;
public:
    Hero *h1;
    Hero ()
    
        hp = 50;
        power = 10; 
    
    static void attackEnemy (Enemy *e1, Hero *h1);
;

static void Hero::attackEnemy(Enemy *e1, Hero *h1)

    e1->hp -= h1->power;


class Enemy

    friend class Hero;
private:
    static int hp, power;
public:
    Enemy ()
    
        hp = 15;
        power = 10;
    
    void attackHero ();
;

int main ()

    Enemy *e1 = new Enemy ();
    Hero *h1 = new Hero ();

    h1->attackEnemy(Enemy *e1, Hero *h1);

    return 0;

我被告知 static 函数和变量能够防止此错误,因为它们是 global,因为它预编译了构建

【问题讨论】:

【参考方案1】:

这里有两个主要问题。

首先,在定义Hero::attackEnemy 时,static 限定符在这里无效。该成员已经在类定义中声明为static,所以这里也不需要应用它。

其次,在Hero::attachEnemy被定义的时候,Enemy类还没有被定义。您需要将Hero::attachEnemy 的定义移动到 class Enemy 的定义之后。

class Enemy;

class Hero 
    ...
;

class Enemy 
    ...
;

void Hero::attackEnemy(Enemy *e1, Hero *h1)

    e1->hp -= h1->power;

另外,这不是一个有效的函数/方法调用:

h1->attackEnemy(Enemy *e1, Hero *h1);

你想要:

h1->attackEnemy(e1, h1);

【讨论】:

只是一个小而重要的更正,...该成员已被声明为静态(未定义为您写的) @dsp_user 谢谢。已编辑。

以上是关于无法访问静态函数内部的私有变量的主要内容,如果未能解决你的问题,请参考以下文章

Java连载58-静态内部类成员内部类详解

4月14日继承与多态

私有变量

Javascript的私有变量和方法共有变量和方法以及特权方法构造器静态共有属性和静态共有方法

java内部私有类的构造函数

java内部类可以访问外部类的静态方法吗