2015-11-01 73 views
0

給定一個有兩個方法需要共享變量的類什麼是在它們之間傳遞/共享該變量的最佳方式?假設該類別中的其他地方不需要該變量。如果該變量是一個STL容器,這是否會改變什麼?在同一類中的方法之間共享對象的C++優先方式

我考慮了以下三個選項:

在一個方法實例化的變量,並通過指針返回它,然後將其刪除的另一種方法。

class MyClass 
{ 
    public: 
     std::vector<int>* method1(); 
     void method2(); 
}; 

std::vector<int>* MyClass::method1() 
{ 
    std::vector<int> *my_int_vector = new std::vector<int>; 
    //manipulate the vector in some way 
    return my_int_vector; 
} 

void MyClass::method2() 
{ 
    std::vector<int> *myvector; 
    myvector = this->method1(); 
    //manipulate the vector in some way 
    delete myvector; 
} 

這種分離新這似乎是乞討出問題方法之間刪除。

或者,您可以使用類私有成員屬性來保存該變量。

class MyClass 
{ 
    private: 
     std::vector<int> myvector; 
    public: 
     void method1(); 
     void method2(); 
}; 

void MyClass::method1() 
{ 
    //manipulate this->myvector 
} 

void MyClass::method2() 
{ 
    this->method1(); 
    //manipulate this->myvector 
} 

這會不必要地將變量暴露給類的其餘部分。

最後,您可以在一個方法中創建一個對象並通過引用傳遞它。

class MyClass 
{ 
    public: 
     void method1(std::vector<int> *my_int_vector); 
     void method2(); 
}; 

void MyClass::method1(std::vector<int> *my_int_vector) 
{ 
    //manipulate my_int_vector in some way 
} 

void MyClass::method2() 
{ 
    std::vector<int> myvector; 
    this->method1(&myvector); 
    //manipulate myvector in some way 
} 

對我來說,這似乎是最好的解決辦法,你不調用new或刪除和變量是不提供給全班同學。

我的評估是否正確,我錯過了哪些更好的選擇?

回答

1

的首選方法是使該變量的成員如果傳遞作爲參數從一個功能到另一種是不可能的。

所以是第三種選擇可能是最好的。

如果該變量是一個STL容器,這是否會改變什麼?

不.C++標準庫中的容器也是普通對象。


關於第二個選項:

這種分離新這似乎是方法之間刪除對乞討出問題。

是。首先使用原始newdelete已經在乞求麻煩。 不必動態分配。當你這樣做時,使用智能指針。

因此,在這種情況下,您可以簡單地通過值傳遞向量。或者如果該功能將被稱爲很多,然後也許使矢量static並通過引用返回它。


你提到你的第二個選項,它

不必要地暴露了變量的類的其餘部分。

如果這是真的一個問題,那麼你的類可能是過大和/或試圖做太多。您應該考慮將班級分成具有明確,最小化和明確職責的小班級(SRP)。

這給我們帶來了第四種選擇,這可能會或可能不會對您的情況有意義:將矢量存儲在它自己的類中,並使該類的兩個方法成員。然後將該班級存儲爲MyClass的成員。

+0

決不使一些靜態和返回一個引用出於性能原因。 –

+0

@SebastianRedl永遠不會?如果它成爲一個問題,我會說_measure_。或者如果你能看出它爲什麼會成爲一個問題,那麼就不要這樣做。 – emlai

0

我說 - 使一個函數創建對象,並通過引用傳遞給其他方法。

對我來說,這似乎是最好的解決辦法,你不調用new或 刪除和變量是不提供給全班同學。

那麼,如果您使用new創建對象,它會產生多大的區別?與其他技術一樣,內存管理也出現了相同的問題。
無論如何,你的出發點是在堆棧上聲明對象。儘量保持對象堆棧分配,並且如果它在堆上 - 選擇智能指針以確保不會發生內存泄漏。

使該類靜態對象裏面的一些佔位符:
1)讓你沾染不相關的對象
2)班,使你的類不是線程安全的

相關問題