2013-01-22 109 views
0

我試圖找出最合理,最安全,最有效的方式來完成此操作,而不使用全局變量。如何在沒有全局變量的情況下共享此數據

假設我有一個類:

class SomeClass{ 
public: someFunction(){...} 
}; 

而另一個類實例化SomeClass的數據成員:

class AnotherClass{ 
    SomeClass theTest; 
    void anotherFunction(){...} 
    int myDataInt; 
}; 

現在,我想在SomeClasssomeFunction,以便能夠方便地訪問myDataIntAnotherClass。一種方法是將int參數添加到someFunction,即AnotherClass通過。也許這是唯一可行的方法。但我希望在someFunctionmyDataInt之間有更多的「自動」訪問。另一種選擇是簡單地在SomeClass中設置AnotherClass的設置數據,它等於它自己的myDataInt。但是,我有兩個類存儲相同的數據,這似乎是多餘的。

其他建議?非常感激。

+0

怎麼樣'類AnotherClass {朋友類SomeClass的; ...};'。其他方法是讓'getter()/ setter()'爲'myDataInt',任何人都可以相應地使用它。 – iammilind

+0

你的例子很有意思,因此毫無意義。沒有什麼神奇的方法可以讓一個外部變量自動地被一個方法使用,而不需要傳入。真正的問題是,爲什麼一個類需要如此密切地瞭解另一個類的數據? – meagar

+0

感謝@iammilind「朋友」的想法是合理的,我不會考慮這一點。 – johnbakers

回答

3

SomeClass指針添加到含AnotherClass

class SomeClass{ 
    AnotherClass* enclosing; 
public: 
    someFunction(){ 
    int x=enclosing->myDataInt; 
    ... 
    } 
}; 

編輯:另外,由iammilind上面提到的,你會想要麼有SomeClassAnotherClass朋友或有一個訪問方法myDataInt

+0

另一個好主意,謝謝。 – johnbakers

+0

@SebbyJohanns,根據你的問題,不,'myDataInt'是'private'。 – iammilind

+0

@iammilind是真的,但我可以很容易地成爲一個公共accessor,在這一點上沒有什麼大不了的。 – johnbakers

0

你可以這樣做:

class SomeClass{ 
public: 
    SomeClass(int & refInt) 
     : sharedInt(refInt) 
    {} 

    int & sharedInt; 
}; 

而且在AnotherClass

class AnotherClass { 
    public: 
    AnotherClass() 
     : theTest(myDataInt) 
    {} 

    private: 
    SomeClass theTest; 
    int myDataInt; 
}; 
+0

有趣,所以不是將int值存儲在兩個不同的地方,而只是對同一數據的引用。如果'AnotherClass'中的myDataInt發生變化,即使它是私有的,'SomeClass'仍然可以通過引用訪問它。可能不是最安全的想法,但我認爲它會起作用。 – johnbakers

+0

爲什麼不安全?在你的例子中,'SomeClass'是專爲'AnotherClass'使用而設計的。唯一需要注意的是'AnotherClass'比'SomeClass'壽命更長,或者至少如果它先死了,那麼不使用該引用。當你在像這樣的類中使用引用時,它會給出指針所沒有的特殊語義。也就是說,你知道參考文獻應該總是有效。 – paddy

1

類應該負責自己的狀態,因此,你希望每個班成員是私有的,並提供接口(成員方法)來訪問它們。

如果AnotherClass和SomeClass只在彼此之間共享幾個字段,我不會很容易地引入friend。一個更好的設計總是試圖將數據隱藏到外面。

我對你的問題的解決方案是SomeClass的具有指向AnotherClass然後訪問它的成員方法如果需要:

class AnotherClass; 

class SomeClass 
{ 
public: 
    SomeClass(AnotherClass* p) : context_ptr_(p) {} 
    void someFunction(); 
    { 
     context_ptr_->setDataInt(3); 
    } 

private: 
    AnotherClass *context_ptr_; 
}; 


class AnotherClass 
{ 
public: 
    AnotherClass() :theTest(this) 
    {   
    } 
    void anotherFunction(){ } 
    void setDataInt(int i) { myDataInt = i; } 
private: 
    SomeClass theTest; 
    int myDataInt; 
}; 
相關問題