Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++类纠缠_C++_Linux_G++ - Fatal编程技术网

C++类纠缠

C++类纠缠,c++,linux,g++,C++,Linux,G++,我试图使用两个类的变量来访问从类A的变量到类B的变量,反之亦然。然而,我想不出一个可能的解决办法。它总是以循环或以下错误结束: error: invalid use of non-static data member 下面是代码示例: Player.h: #ifndef _PLAYER_H_ #define _PLAYER_H_ #include "Segment/Dynamic_Segment.h" class Attributes_P; class Attributes_

我试图使用两个类的变量来访问从类A的变量到类B的变量,反之亦然。然而,我想不出一个可能的解决办法。它总是以循环或以下错误结束:

error: invalid use of non-static data member  
下面是代码示例:

Player.h:

  #ifndef _PLAYER_H_
  #define _PLAYER_H_

#include "Segment/Dynamic_Segment.h"

class Attributes_P;

class Attributes_P : public Attributes_DS{
  protected:
  int inv_mcols, inv_mrows;

  public:
  Attributes_P();
  void controls( int MKEY_UP, int MKEY_RIGHT, int MKEY_DOWN, int MKEY_LEFT );
  void inventory( int inv_mcols, int inv_mrows );
};

class Player : public Dynamic_Segment{
  protected:
  int   **inv;

  public:

  int   MKEY_UP, MKEY_RIGHT, MKEY_DOWN, MKEY_LEFT;

  public:

  Player();
  Attributes_P set;
  friend class Core;
  friend class Attributes_P;

};
#endif
Player.cpp:

#include "Segment/Player.h"

Attributes_P::Attributes_P(){};

Player::Player() : Dynamic_Segment(){
  set.inv_mcols = 0;
  set.inv_mrows = 0;
}

void Attributes_P::inventory( int inv_mcols, int inv_mrows ) {
  this->inv_mcols = inv_mcols;
  this->inv_mrows = inv_mrows;
  Player::inv = new int*[this->inv_mcols]; //<--- Error here
  for( int i = 0; i < this->inv_mrows; i++ ) {
    Player::inv[i] = new int[this->inv_mcols]; //<--- Error here
  }
}

void Attributes_P::controls( int MKEY_UP, int MKEY_RIGHT, int MKEY_DOWN, int MKEY_LEFT ) {
  Player::MKEY_UP = MKEY_UP; //<--- Error here
  Player::MKEY_RIGHT = MKEY_RIGHT; //<--- Error here
  Player::MKEY_DOWN = MKEY_DOWN; //<--- Error here
  Player::MKEY_LEFT = MKEY_LEFT; //<--- Error here
}
我的头撞在墙上已经有一段时间了。。。任何想法都将不胜感激

成员

Player::MKEY_UP
Player::MKEY_RIGHT
Player::MKEY_DOWN
Player::MKEY_LEFT
不是静态的,因此只能通过类型为Player的对象访问它们,而不能通过类实例访问它们

假设您创建了两个播放器对象,p1和p2。调用Attributes_P::controls时,应该更改两个对象的哪个成员?p1还是p2

如果希望在播放器对象之间共享这些成员,可以将其声明为静态成员,也可以将特定播放器对象作为参数传递并直接访问其成员。这是逻辑的一部分,选择取决于您希望程序如何工作。

成员

Player::MKEY_UP
Player::MKEY_RIGHT
Player::MKEY_DOWN
Player::MKEY_LEFT
不是静态的,因此只能通过类型为Player的对象访问它们,而不能通过类实例访问它们

假设您创建了两个播放器对象,p1和p2。调用Attributes_P::controls时,应该更改两个对象的哪个成员?p1还是p2


如果希望在播放器对象之间共享这些成员,可以将其声明为静态成员,也可以将特定播放器对象作为参数传递并直接访问其成员。这是逻辑的一部分,选择取决于您希望程序如何工作。

您不能访问属性MKEY_UP、MKEY_RIGHT、MKEY_DOWN、MKEY_LEFT&inv,因为它们是私有的


让它们成为私有的,并编写getter/setter

您无法访问属性MKEY_UP、MKEY_RIGHT、MKEY_DOWN、MKEY_LEFT&inv,因为它们是私有的


让它们成为私有的,并编写getter/setter

我认为您的数据可能过于紧密地交织在一起,可能应该是一个类。类的一个用途是封装数据,这样你就不会去摆弄别人的隐私了。此外,在使用新的和阵列等时,还存在其他问题。但是

在Attributes_p::inventory中,您试图修改inv,它被声明为Player的成员。但他不知道你指的是哪个球员。你要么

将播放器实例传递到库存函数,或 使用对玩家的引用初始化属性。 备选案文1:

void Attributes_P::inventory(int inv_mcols, int inv_mrows, Player& player) {
    player.inv = ...
}
备选案文2:

class Player; // needed so compiler understands next few lines refering to Player

class Attributes_P {
    Player& m_player;
public:
    Attributes_P(Player& player) : m_player(player) {
    }
};

class Player {
    Attributes_P m_attributes;
public:
    Player() : m_attributes(*this) { // pass self to Attributes_P constructor
    }
}

void Attributes_P::inventory(int inv_mcols, int inv_mrows) {
    m_player.inv = ...
}

我认为您的数据可能过于紧密地交织在一起,可能应该只是一个类。类的一个用途是封装数据,这样你就不会去摆弄别人的隐私了。此外,在使用新的和阵列等时,还存在其他问题。但是

在Attributes_p::inventory中,您试图修改inv,它被声明为Player的成员。但他不知道你指的是哪个球员。你要么

将播放器实例传递到库存函数,或 使用对玩家的引用初始化属性。 备选案文1:

void Attributes_P::inventory(int inv_mcols, int inv_mrows, Player& player) {
    player.inv = ...
}
备选案文2:

class Player; // needed so compiler understands next few lines refering to Player

class Attributes_P {
    Player& m_player;
public:
    Attributes_P(Player& player) : m_player(player) {
    }
};

class Player {
    Attributes_P m_attributes;
public:
    Player() : m_attributes(*this) { // pass self to Attributes_P constructor
    }
}

void Attributes_P::inventory(int inv_mcols, int inv_mrows) {
    m_player.inv = ...
}

也就是说,你需要将对象作为参数传递给属性P::Controls。我确实有玩家对象,并读取它们各自的MKEY_向上、MKEY_向右、MKEY_向下、MKEY_向左。因此,我希望将其称为p1.MKEY_DOWN,并通过p1.set.controls'w',a',s',d'设置控件;将这些值设置为MKEY_UP,MKEY_RIGHT,MKEY_DOWN,MKEY_LEFT@user203432那么就把p1作为参数传递出去。@LuchianGrigore对不起,我好像不明白。通过p1后,设置控件“w”、“a”、“s”、“d”,我需要将这些值赋给MKEY_UP、MKEY_RIGHT、MKEY_DOWN、MKEY_LEFT,它们回到拥有属性P成员的类Player中。@user203432不强制转换它。直接使用set即可。我迷路了。我开始觉得你应该试试一本书:PAKA你需要把对象作为参数传递给Attributes\P::control我确实有player对象,并读取它们各自的MKEY\u,MKEY\u RIGHT,MKEY\u DOWN,MKEY\u LEFT。因此,我希望将其称为p1.MKEY_DOWN,并通过p1.set.controls'w',a',s',d'设置控件;将这些值设置为MKEY_UP,MKEY_RIGHT,MKEY_DOWN,MKEY_LEFT@user203432那么就把p1作为参数传递出去。@LuchianGrigore对不起,我好像不明白。通过p1后,设置控件“w”、“a”、“s”、“d”,我需要将这些值赋给MKEY_UP、MKEY_RIGHT、MKEY_DOWN、MKEY_LEFT,它们回到拥有属性P成员的类Player中。@user203432不强制转换它。直接使用set即可。我迷路了。我开始觉得你应该读一本书:你似乎有点困惑。为什么你会知道包含它的玩家的任何信息?您以前使用过哪些语言可能会影响您对对象如何工作的概念?这不是概念,而是我希望实现的结果。我确实意识到这确实是完全错误和不合逻辑的。这就是为什么我在寻找另一个选择。你似乎有点困惑。为什么你会知道abo的任何事情
是那个放它的玩家吗?您以前使用过哪些语言可能会影响您对对象如何工作的概念?这不是概念,而是我希望实现的结果。我确实意识到这确实是完全错误和不合逻辑的。这就是为什么我在寻找另一种选择。我想你错了。它们是公开的,实际上这是目前为止最好的方法。谢谢,我想你弄错了。它们是公开的,实际上这是目前为止最好的方法。谢谢当m_属性将玩家传回来时,我看不到它会去哪里请回答!在这方面有困难:我认为你需要更准确地描述你的问题。把你的代码缩减到最小的例子,它仍然会给你一个问题,也许15行,一个完整的例子,然后发布一个新的,更精确的问题。错误:未初始化的引用成员“Attributes\u P::m\u player”[-fppermissive]我在示例中初始化了引用。不是吗?当穆属性将玩家传回来时,我看不到它会去哪里请回答!在这方面有困难:我认为你需要更准确地描述你的问题。把你的代码缩减到最小的例子,它仍然会给你一个问题,也许15行,一个完整的例子,然后发布一个新的,更精确的问题。错误:未初始化的引用成员“Attributes\u P::m\u player”[-fppermissive]我在示例中初始化了引用。你不觉得吗?