2016-09-14 79 views
0

對於C++,我相當愚蠢,因爲我來自具有良好Python知識的純Java背景,但我正在嘗試使用一個簡單的C++類來引用頭文件,並在源文件中的函數中訪問它。我可以在構造函數中很好地訪問它,但是隻要我使用函數,根據Eclipse CDT和構建鏈,它顯然不存在。無法在函數內部訪問的類字段

頭文件(simulator.h):

#ifndef GAME_PHYSICS_SIMULATOR_H_ 
#define GAME_PHYSICS_SIMULATOR_H_ 

#include <vector> 

#include "../world/object.h" 

class simulator { 
public: 
    simulator(); 
    virtual ~simulator(); 

    void add_object(object o); 

private: 
    std::vector<object> objects; 
}; 

#endif /* GAME_PHYSICS_SIMULATOR_H_ */ 

的源文件(simulator.cpp):

#include "simulator.h" 

simulator::simulator() { 
    object o; 
    objects.push_back(o); // Works fine in terms of acknowledging the existence of 'objects'. 
} 

simulator::~simulator() {} 

void add_object(object o) { 
    objects.push_back(o); // Immediately throws error saying 'objects' doesn't exist. 
} 

有趣的是,雖然,是,我可以訪問諸如int的或std::string的事情精細。只要我嘗試使用矢量,就會中斷。有任何想法嗎?

+1

爲什麼downvote? – finnrayment

+0

目前您將'add_object'定義爲全局非成員函數。 –

+0

Downvote我不知道,但無論如何都投票結束,因爲它可能對未來的訪問者沒有用處,並且標題使得很難發現。 joachim的意思是:如果沒有'simulator ::',編譯器會將它視爲全局命名空間 – stijn

回答

4

使用simulator::add_object,因爲它是一個類方法,就像你已經爲構造函數和析構函數一樣。

+0

哦,我的天啊。我不相信我犯了這個錯誤。非常感謝! – finnrayment

3

與Java相比,您可以定義類定義之外的函數(例如在額外的.cpp文件中,通常會這樣做),在這種情況下,您必須在函數簽名前加上class_name::

如果不是這樣,因爲你的函數是不是在類的命名空間,它成爲一個非成員功能(意思是它不屬於任何類的函數),它不知道objects成員這是你simulator類中。