2017-08-02 56 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