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

How to share this data without global vars

本文关键字:共享 情况下 数据 全局变量      更新时间:2023-10-16

我正在尝试找出最符合逻辑,安全,有效的方法来完成这一点,而不使用全局变量。

假设我有一个类:

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

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

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

现在,我希望SomeClass中的someFunction能够轻松访问AnotherClass中的myDataInt。一种方法是将int参数添加到AnotherClass传入的someFunction中。也许这是唯一体面的方式。但我希望someFunctionmyDataInt之间有一个更"自动"的访问。另一种选择是简单地让AnotherClassSomeClass中设置与自己的myDataInt相等的数据。但是我有两个类存储相同的数据,这似乎是多余的。

还有其他建议吗?感谢。

SomeClass中添加一个指向AnotherClass的指针:

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

编辑:另外,正如上面提到的,您将希望SomeClass成为AnotherClass的朋友,或者为myDataInt提供一个访问器方法。

类应该对自己的状态负责,因此您希望每个类成员都是私有的,并提供接口(成员方法)来访问它们。

如果AnotherClass和SomeClass之间只共享几个字段,我就不会那么容易地介绍friend。一个更好的设计总是试图将数据隐藏在外部。

我对你的问题的解决方案是SomeClass持有一个指向另一个类的指针,然后访问它的成员方法,如果需要:

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;
};

你可以这样做:

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

AnotherClass中:

class AnotherClass {
  public:
    AnotherClass()
        : theTest(myDataInt)
    {}
  private:
    SomeClass theTest;
    int myDataInt;
 };
相关文章: