2017-08-02 35 views
0

首先,如果我在问题中使用了不正确的术语,我想道歉。我没有任何正式的编程培训。这是我能够做的最好的表达问题。如何访问超范围课程?

我的问题是这样的:

在下面的代码结构,Inventory类怎么能有项目载体的播放器类中未做矢量静态的完全访问权限?

- main.cpp中

#include <iostream> 
#include <vector> 

#include "World.hpp" 
#include "Interface.hpp" 

int main() 
{ 
    World objWorld; 
    Interface objInterface; 
    return 0; 
} 

- World.hpp

#pragma once 
#include "Player.hpp" 

class World 
{ 
public: 
    Player objPlayer; 
}; 

- Player.hpp

#pragma once 

class Player 
{ 
public: 
    std::vector<int> Items; 
}; 

- Interface.hpp

#pragma once 
#include "Inventory.hpp" 

class Interface 
{ 
public: 
    Inventory objInventory; 
}; 

- Inventory.hpp

#pragma once 

class Inventory 
{ 
public: 
    // Needs to have complete access to Items, be able to see and modify the vector 
}; 
+1

类不会在运行时存在。对象确实存在。如果ypu给它们引用另一个对象,对象可以访问其他对象。 – 2017-08-02 11:33:15

+0

如何将objWorld.objPlayer的引用传递给objInterface.objInventory? –

+0

您的编辑完全改变了问题的焦点。请为此打开一个新问题。 (提示:它不会编译,因为'库存'不是默认构造的,实际上不能,只要它有一个引用成员)。 – ComicSansMS

回答

1

有几个问题,你必须考虑。

  1. 访问权限。从课外(即从班级的成员职能等以外的任何代码),只有public成员可以访问,除了friend s,它们具有完全访问权限。
  2. 知名度。为了使用会员,您必须看到其声明。

因此,你应该

// Inventory.hpp 
#pragma once 
#include "World.hpp" // makes class World visible 
class Inventory 
{ 
    World& objWorld; // reference to 'my' world object 
public: 
    Inventory(World& w) : objWorld(w) {} 
    void foo() 
    { 
     std::sort(objWorld.objPlayer.Items.begin(), 
        objWorld.objPlayer.Items.end()); 
    } 
}; 

当然,你必须适应你的代码的相应其余部分:

// Interface.hpp 

#pragma once 
#include "Inventory.hpp" 

class Interface 
{ 
    Inventory objInventory; 
public: 
    Interface(World& w) : objInventory(w) {} 
}; 

// main.cpp 

#include "Interface.hpp" 

int main() 
{ 
    World objWorld; 
    Interface objInterface(objWorld); 
    return 0; 
} 
+0

如果我这样做,应该如何在接口中创建objInventory?目前不编译。 –

+0

@ NathanielG.M。请参阅编辑答案 – Walter

0

类成员可以使用成员访问运算符.(周期字符)来访问。左边是(一个表达式)类的一个实例,右边是成员的名字。

p成为Player的实例。表达式p.Items将产生该实例的向量。在成员可以访问之前,该类必须被定义。

+0

但在我的代码结构库存不能“看到”objWorld.objPlayer –

+0

@ NathanielG.M。你的意思是在“Inventory”的成员函数中吗?将玩家的引用作为参数传递给该成员函数也许会有意义。 – user2079303

+0

有没有办法直接修改库存内的向量? –

2

这不是一个C++的问题,这是面向对象编程的问题。

有很多方法可以做到这一点。但他们都涉及多个对象一起工作。 Player必须有一个参考(指针)Inventory,或Inventory必须有一个参考玩家 - 不知何故。

这里有一些选择:

您可以通过在构造函数指针(这只是一个简单的例子,请使用共享指针)

class Inventory 
{ 
private: 
    Player *owner; 
public: 
    Inventory(Player *owner) : owner(owner){} 
}; 

把它作为方法的参数

class Inventory 
{ 
public: 
    void drawFor(Player *owner); 
}; 

设置一个字段值。

class Inventory 
{ 
private: 
    Player *owner; 
public: 
    void setOwner(Player *owner) {this->owner = owner;} 
}; 

作为一个侧面说明,你确定Player有项目的载体?我敢打赌,Player可能拥有一个InventoryInventory不仅仅是一个项目的矢量。它具有(可能复杂的)物品数量限制,它可以保持影响玩家移动的物品的重量,可以通过添加容器来扩展物品的重量。所有这些都可以用于PlayerNPC。你只需要拿出一个良好的界面Inventory

+0

玩家拥有库存确实是我必须要做的,如果我无法找出其他方式来做到这一点。不幸的是,我现在绘制的游戏画面现在已经设置好了,玩家绘制自己的库存会让事情变得很糟糕,尤其是当涉及到适用于World类绘制的所有内容的着色器时。你能不能给我一些关于“不知何故”部分的更多说明? –

+0

@ NathanielG.M。玩家不必绘制自己的库存 - 它只需拥有它。图纸可以完全分开。 – Arkadiy