我想使用一個類:class2,在一個類中:class1。從我讀到的內容來看,為了防止回圈依賴,必須在 class1.h 中轉發宣告 class2 并將其設為指標。在我的 class1.cpp 檔案中從 class2 呼叫函式后。我無法在沒有“無法讀取記憶體”或 nullptr 的情況下呼叫 class2 中的變數。
這是我的代碼,感謝您的幫助:
//main.cpp
#include "Login.h"
#include <iostream>
using namespace std;
int main() {
Login login;
login.StartMenu();
cout << "ENDING" << endl;
system("pause");
return 0;
}
//Login.h (Class1)
#pragma once
#include <iostream>
using namespace std;
class GameManager;
class Login {
public:
void StartMenu();
private:
GameManager* manager;
};
//登錄.cpp
#include "Login.h"
#include "GameManager.h"
void Login::StartMenu() {
manager->GameStart();
}
//GameManager.h (Class2)
#pragma once
class GameManager {
public:
void GameStart();
private:
int level = 1;
};
//游戲管理器.cpp
#include "Login.h"
#include "GameManager.h"
void GameManager::GameStart() {
cout << level;
}
uj5u.com熱心網友回復:
通常,將標頭之間的依賴關系保持在最低限度是一個好主意,并且對僅前向宣告的類使用指標是一種既定的方法。即使沒有回圈依賴,這也是一種很好的做法,因為它可以大大減少大型專案中的重新編譯時間。
關于您的具體問題:本質上,Login類,尤其是Login::StartMenu函式,需要知道GameManager 要使用哪個實體。指向該實體的指標將存盤在manager. 理想情況下,您可以在Login實體的構造時通過GameManager *建構式引數來判斷:
#ifndef LOGIN_H
#define LOGIN_H
class GameManager;
/// This class handles the login procedure for a specific
/// game manager which must be provided to the constructor.
/// It cannot be copied (so it cannot be
/// in arrays) or default-constructed.
class Login {
public:
/// The constructor does nothing except initializing manager.
/// @param gmPtr is a pointer to the game manager
/// this instance is using.
void Login(GameManager *gmPtr)
: manager(gmPtr) { /* empty */ }
void StartMenu();
private:
GameManager* manager;
};
#endif // LOGIN_H
為了完整起見,以下是您將如何使用它:
#include "Login.h"
#include "GameManager.h"
#include <iostream>
using namespace std;
int main() {
GameManager gm;
Login login(&gm); // <-- provide game manager to login
login.StartMenu();
cout << "ENDING" << endl;
system("pause");
return 0;
}
如果由于GameManager實體尚不存在或在構造Login實體期間未知而無法實作(例如,如果您有一個Login實體陣列,其元素必須是默認構造的),您可以為該Login::StartMenu方法提供引數。但是建構式引數更受歡迎,因為您可以確保該類在其余代碼中起作用——這種“不變數”是建構式存在的主要原因。
如果所有函式都獲得該指標引數,則您可能根本不需要持有指標。Login類是否與a 具有一對一的關系GameManager(在這種情況下它只是持有一個指向它的指標)或不(在這種情況下每個函式每次都被告知)是一個設計決定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/366065.html
