0

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

假设我有一堂课:

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

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

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

现在,我希望someFunctioninSomeClass能够轻松访问myDataIntin AnotherClass。一种方法是向传入的参数添加一个参数int。也许这是唯一合适的方法。但我希望在和之间进行更“自动”的访问。另一种选择是简单地设置数据等于它自己的。但是我有两个类存储相同的数据,这似乎是多余的。someFunctionAnotherClasssomeFunctionmyDataIntAnotherClassSomeClassmyDataInt

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

4

3 回答 3

3

添加指向包含AnotherClassin的指针SomeClass

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

编辑:另外,正如上面 iammilind 所述,您将希望SomeClass成为.AnotherClassmyDataInt

于 2013-01-22T05:00:49.593 回答
1

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

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

我对您的问题的解决方案是 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;
};
于 2013-01-22T05:25:05.550 回答
0

你可以这样做:

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

    int & sharedInt;
};

并在AnotherClass

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

  private:
    SomeClass theTest;
    int myDataInt;
 };
于 2013-01-22T05:03:26.120 回答