如何在没有全局变量的情况下共享此数据

时间:2013-01-22 04:57:44

标签: c++

我试图找出最合理,最安全,最有效的方法来实现这一点,而不使用全局变量。

假设我有一个班级:

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

另一个类将SomeClass实例化为数据成员:

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

现在,我希望someFunction中的SomeClass能够轻松访问myDataInt中的AnotherClass。一种方法是将int参数添加到someFunction传递的AnotherClass。也许这是唯一可行的方法。但我希望在someFunctionmyDataInt之间进行更“自动”的访问。另一种选择是让AnotherClass中的SomeClass设置数据等于其自己的myDataInt。但后来我有两个类存储相同的数据,这似乎是多余的。

还有其他建议吗?非常感谢。

3 个答案:

答案 0 :(得分:3)

AnotherClass中添加指向SomeClass的指针:

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

编辑:此外,正如上面的iammilind所述,您希望SomeClass成为AnotherClass的朋友或拥有myDataInt的访问者方法。

答案 1 :(得分: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;
};

答案 2 :(得分:0)

你可以这样做:

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

    int & sharedInt;
};

AnotherClass

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

  private:
    SomeClass theTest;
    int myDataInt;
 };