我有許多函式定義,我將它們放在不同的 cpp 檔案中,函式宣告在它們各自的 .h 檔案中。
我有一組變數,我放在一個 .h 檔案中。這些變數需要通過不同的函式進行修改。我使用靜態來保留每個函式的更改,但我聽說這是一種不好的編碼習慣。不然怎么辦?例如 -
變數.h
class variable{
static int x;
static int y;
};
函式1.h
class function(){
public:
void function1();
}
功能 2 類似
功能 1.cpp
void function1(){
// does something with x and y (used as (variable::x=2;variable::y=3)
}
函式2.cpp
void function2(){
// does something with x and y (used as variable::x =2;variable::y =2)
}
主檔案
int variable::x;
int variable::y;
int main(){
obj.function1(); (obj is object of function1 class)
obj2.function2(); (obj2 is object of function2 class)
cout << variable::x << variable::y << endl;
}
我在不同的 cpp 檔案中使用了不同的物件,但一個函式的變化沒有反映在另一個函式中。請問怎么用?
uj5u.com熱心網友回復:
您可以簡單地將這些變數移動到另一個類中:
struct Shared {
int x;
int y;
};
現在你可以將一個實體作為引數傳遞給這個類,這稱為依賴注入:
void foo(Shared& shared) {
shared.x = 4;
shared.y = 2;
}
這更好,因為您不再擁有任何全域狀態。您可以通過參考該類的不同實體多次獨立地使用該函式Shared。
通過在該類的建構式中“注入”實體來更進一步是很常見的。如果該類的實體應該始終參考同一個實體,這將很有幫助:
struct Foo {
Shared& m_shared;
Foo(Shared& shared)
: m_shared(shared)
{
}
void foo() {
m_shared.x = 4;
m_shared.y = 2;
}
};
uj5u.com熱心網友回復:
是的,正如您提到的,為此目的使用靜態變數是一種反模式。更好的模式(不知道應用程式的背景)是使用組合模式。如果您的函式 f1() 和 f2() 在 C1 和 C2 類中,您將創建一個額外的資料物件 D1(帶有相關變數),并在 C1 和 C2 的建構式中注入 D1 的物件,所以兩者類對資料物件的操作。這種情況還有其他解決方案,但我想這是最普遍的。谷歌 C 設計模式以找到更通用的模式。
uj5u.com熱心網友回復:
您可以將智能指標用于全域物件
struct MyGlobal
{
std::shared_ptr<Core> core;
MyGlobal(){ core=std::make_shared<Core>(); }
void changeVariableX(int X)
{
core->X = X;
}
};
您可以使用 MyGlobal 實體移動、復制、做任何您想做的事情,它們仍然指向同一個核心專案。只要確保它們都是從同一個實體中填充的,如下所示:
int main()
{
MyGlobal global;
auto something = useSomeFunctionWith(global);
auto somethingElse = useAnotherFunctionWith(global);
...
// use something and somethingElse to change X, both point to the same X
}
如果函式不是執行緒安全的,那么你應該在 changeVariableX 方法中添加一個鎖守衛。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/419616.html
標籤:
下一篇:無法在我創建的s3存盤桶中使用sagemaker_session.upload_data上傳資料,它被存盤在默認的s3存盤桶中
