2013-01-22 43 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; 
}; 
相关问题