如何访问超出范围的课程?

时间:2017-08-02 11:29:43

标签: c++ class

首先,如果我在问题中使用了错误的术语,我想道歉。我没有任何正式的编程培训。这是我能做的最好的传达问题。

我的问题是:

在下面的代码结构中,Inventory类如何完全访问Player类中的Items向量而不使向量静态?

- main.cpp

(Eq a, Num a, Num t) => a -> t

- World.hpp

#include <iostream>
#include <vector>

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

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

- Player.hpp

#pragma once
#include "Player.hpp"

class World
{
public:
    Player objPlayer;
};

- Interface.hpp

#pragma once

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

- Inventory.hpp

#pragma once
#include "Inventory.hpp"

class Interface
{
public:
    Inventory objInventory;
};

3 个答案:

答案 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

提供一个好的界面

答案 1 :(得分:1)

您必须考虑几个问题。

  1. 访问权限。从类外部(即除了类成员函数之外的任何代码等),只有public成员可以访问,但friend s除外,它们具有完全访问权限。
  2. 可视性。要使用成员,您必须看到其声明。
  3. 因此,你应该

    // 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;
    }
    

答案 2 :(得分:0)

可以使用成员访问运算符.(句点字符)访问类成员。左侧是(产生的表达式)类的实例,右侧是成员的名称。

p成为Player的实例。表达式p.Items将生成该实例的向量。必须先定义该类,然后才能访问其成员。