C ++类纠缠

时间:2013-01-11 15:34:03

标签: 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_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
}

我的头撞墙已经有一段时间了......任何想法都会受到赞赏!

3 个答案:

答案 0 :(得分:4)

成员

Player::MKEY_UP
Player::MKEY_RIGHT
Player::MKEY_DOWN
Player::MKEY_LEFT

不是static,因此您只能通过Player类型的对象访问它们,而不能通过类实例访问它们。

考虑创建2个玩家对象p1p2。当你致电Attributes_P::controls时,你应该改变两个对象成员中的哪一个? p1p2

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

答案 1 :(得分:2)

您无法访问属性MKEY_UP,MKEY_RIGHT,MKEY_DOWN,MKEY_LEFT&amp;因为他们是私人的。

将它们设为私有并写入getter / setter!

答案 2 :(得分:0)

我认为您的数据可能过于紧密地交织在一起,也许应该只是一个类。类的一个目的是封装数据,因此您不会摆弄其他人的私有。使用new和数组等等,还有其他问题。但是......

Attributes_P::inventory中,您正在尝试修改inv,该Player被声明为Attributes_P的成员。但是Player并不知道您指的是哪个播放器。你需要

  1. inventory个实例传递到Attributes_P函数或
  2. 初始化player并引用void Attributes_P::inventory(int inv_mcols, int inv_mrows, Player& player) { player.inv = ... }
  3. 选项1:

    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 = ...
    }
    

    选项2:

    {{1}}