簡體   English   中英

從另一個類C ++訪問對象

[英]Access object from another class c++

我正在慢慢學習c ++,但是在開發程序時卻難以訪問Ive創建的對象。 我的對象是在名為source.cpp的頁面上創建的,

Tilemap background;

我有另一個頭文件,該文件在tern中調用需要訪問“背景”的函數,該文件稱為“ player.cpp”,但是我不知道如何定義它。 我已經將標題文件包含在tilemap類中,但是由於該對象是在其他位置創建的,因此我不知道如何引用它。 Google今天不是我的朋友,我的搜索沒有帶來任何好處。

Tilemap background;

在文件范圍(即不在功能塊內部)中編寫的是全局變量定義 它在全局數據中為稱為background的變量分配存儲。

如果要從另一個C ++源文件引用此對象,則需要先聲明該變量,以便編譯器知道其類型。

// In another .cpp file
extern Tilemap background;

void f()
{
    background.something();
}
Tilemap background;

放置在全局范圍內(例如,在source.cpp文件開頭的某個位置)聲明了一個全局變量,默認情況下,該變量只能在同一編譯單元內訪問(在這種情況下,可能僅在source.cpp內)。 player.cpp ,編譯器不知道變量background存在。

一種解決方案是:

extern Tilemap background;

player.cpp中讓編譯器知道在其他地方定義了Tilemap類型的全局變量。

但是,我發現最好避免使用這種全局變量,而是在調用某些成員函數(“方法”)時嘗試以參數的形式“傳播”(傳遞)變量/對象。 畢竟,對象之間的通信就是面向對象編程的目的……(如果我知道此類的上下文/如果您共享一些代碼,我將提供一些具體的示例……)

好的,所以您正在學習C ++,然后從一開始就學習良好的做法,並避免C ++的陷阱。 以這種方式聲明和使用C ++全局對象會導致非常討厭的行為和冗長的調試會話,因為您不能確定在文件全局范圍中聲明的全局對象背景在另一個文件中使用時是否已初始化並正確構造。 當您使用這樣的對象時,我們將其稱為B,在另一個文件中的另一個全局對象A中,您不能確定B在A之前被初始化,這會導致非常討厭的錯誤,或者如果您很幸運會崩潰。 然后的解決方案是:使對象背景成為局部靜態對象,即像這樣的局部函數:

TileMap& getBackground() {
  static TileMap background; //use of "camel case" for the class name
  return background; //return a reference to it 
}

而已。 任何您想使用背景的地方,只需調用getBackground()。 第一次調用它時,背景局部靜態將被初始化並且很好用。

有人會說這種技術與單例設計模式有關,但這並不是我的目的,這只是在絕對需要時使用全局對象的正確方法。 C ++是一種很棒的語言,尤其是在C ++ 11發行版中,但是它有一些陷阱,您需要注意。 幫自己一個忙:獲取Effetive C ++的副本,它將教您正確使用該語言所需的幾乎所有知識

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM