0

グローバル変数を使用せずに、これを達成するための最も論理的で安全で効率的な方法を見つけようとしています。

クラスがあるとします:

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

そして、別のクラスSomeClassがデータ メンバーとしてインスタンス化されます。

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

someFunctionここで、 inからinSomeClassに簡単にアクセスできるようにしたいと考えています。1 つの方法は、そのパスにパラメーターを追加することです。おそらく、これが適切な唯一の方法です。しかし、私はとの間のより「自動的な」アクセスを望んでいました。もう 1 つのオプションは、それ自体に等しいデータを単に設定することです。しかし、同じデータを格納する 2 つのクラスがあり、冗長に見えます。myDataIntAnotherClassintsomeFunctionAnotherClasssomeFunctionmyDataIntAnotherClassSomeClassmyDataInt

他の提案はありますか?とても有難い。

4

3 に答える 3

3

含むAnotherClassinへのポインターを追加しSomeClassます。

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

編集: また、上記の iammilnd で述べたようにSomeClass、 のフレンドになるAnotherClassか、 のアクセサ メソッドを使用する必要がありますmyDataInt

于 2013-01-22T05:00:49.593 に答える
1

クラスはそれ自身の状態を担当する必要があるため、各クラス メンバーを非公開にし、それらにアクセスするためのインターフェイス (メンバー メソッド) を提供する必要があります。

friendAnotherClass と 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 に答える