首先,如果我在问题中使用了错误的术语,我想道歉。我没有任何正式的编程培训。这是我能做的最好的传达问题。
我的问题是:
在下面的代码结构中,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;
};
答案 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
可能拥有Inventory
。 Inventory
不仅仅是项目的向量。它具有(可能复杂的)物品数量限制,它可以保持影响玩家移动的物品的重量,可以通过添加容器来扩展。所有这些对Player
或NPC
都很有用。你只需要为Inventory
答案 1 :(得分:1)
您必须考虑几个问题。
public
成员可以访问,但friend
s除外,它们具有完全访问权限。因此,你应该
// 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
将生成该实例的向量。必须先定义该类,然后才能访问其成员。