11

私は次のようなクラスを持っています::

Class Test
{
  public:
  void Check(){//dosomething};
  static void call(){//I want to call check()};
};

call()は静的メンバーであるため、非静的関数を呼び出すことはできません。したがって、call()でCheck()を使用すると、テストポインターを作成してから、Check()を指すようになりますが、良くありません、これを行うためのより良い方法はありますか?静的関数ですべてを書き直すことができるので、Check()を再度呼び出す必要はありませんが、Check()でコードを再利用し、コードの繰り返しを回避する必要があります。

4

4 に答える 4

13

インスタンスが必要なため、インスタンスを作成するか、静的インスタンスを使用するか、次のようにパスする必要がありますcall()

Class Test
{
  private:
  static Test instance;

  public:
  void Check(){//dosomething};
  // use one of the following:
  static void call(Test& t){ t.check(); };
  static void call(){ Test t; t.check(); };
  static void call(){ instance.check(); };
};
于 2012-11-11T13:23:03.140 に答える
3

これは、いくつかの悪い設計が行われているように聞こえます。

とにかく、あなたができることは、Test in callのインスタンスを作成し、そのインスタンスでCheckを呼び出すことです。呼び出しの実装は次のようになります。

void call(){
  Test test;
  test.Check();
}

ただし、CheckがTestのメンバーに対して何かを行う場合、もちろん、作成されたTestオブジェクトにのみ適用されることに注意してください。呼び出しを本当に静的にしたいのか、それともチェックしないようにしたいのかを再考します。

于 2012-11-11T13:22:15.203 に答える
0

これに対する簡単な答えはありません。できることはいろいろありますが、どちらが正しいかはコードの意味によって異なります。これは設計上の問題であり、プログラミング上の問題ではありません。

ポインタを作成するなど、実行できるさまざまなプログラミングのトリックをすでに提案しましたTest(実際には、ポインタは必要ありません。オブジェクトTestだけが必要です)。Testもっとトリックを提案することもできます。たとえば、call()静的にならないように書き直すか、(ほぼ同じことですが)Testポインターをパラメーターとして渡してcall()それを使用するか、グローバルTestオブジェクトを作成して使用することができます。これらのどれも問題の核心にはなりません。あなたの質問に答えるには、なぜ私がcall()最初に静的にしたのか、なぜ静的関数が非静的関数を呼び出す必要があるのか​​などの質問をする必要があります。

それを説明できれば、より具体的なアドバイスをする方が簡単です。

于 2012-11-11T13:24:44.857 に答える
0

非静的メンバー関数と静的メンバー関数の主な違いは、後者にはオブジェクトがないことです。ただし、他のすべてのメンバーと同じアクセス権限があります。

ただし、静的メンバーから非静的メンバー関数を呼び出す場合でも、オブジェクトを作成する必要があります。多くの場合、静的メンバー関数は、オブジェクトに到達するために何らかのコンテキストで渡されます。あなたの質問の音から、静的関数と非静的関数は、必要とせず、反対しない同様のことを行うことを意図しているようです。この場合、オブジェクトに依存しない共通部分を別の関数に因数分解し、それをとの両方から呼び出すのがおそらく最善call()ですCheck()

void Test::call() {
    common();
    // ... other code
}
void Test::Check() {
    common();
    // ... other code, possibly depending on "this"
}
void Test::common() {
    // logic shared by both call() and Check() but not depending on "this"
}

共通コードにオブジェクトが必要な場合は、静的メンバー関数でオブジェクトを作成する以外に方法はありません。

于 2012-11-11T13:27:19.807 に答える