0

次のコードで「この行」を実現したいと思います。最も論理的な方法は、GetDog を静的に設定することですが、「これ」を使用することはできません。それを回避する方法はありますか?(そうではありません、私はそれを試していたので、質問に関係のない行がいくつかあります)

#include <iostream>

class Dog
{
public:
    static int a;
    Dog& GetDog(int k)
    {
        this->a = k;
        return *this;
    }
    int bark()
    {
        return a*a;
    }
};

int Dog::a=0;

int main()
{
    Dog puppy;
    int i = puppy.GetDog(4).bark();
    cout<<i<<endl;
    cout<<Dog::a<<endl;
    //i = Dog::GetDog(6).bark();                 //this line
    return 0;
}

これを行うことに大きな利点があるわけではありません (クラスを宣言する必要がないというだけです) が、私が使用している一部のパッケージで使用されていることがわかりました。それがどのように行われるかを理解したいと思います。

class EXOFastFourierTransformFFTW
{
    public:
    static EXOFastFourierTransformFFTW& GetFFT(size_t length);
    virtual void PerformFFT(const EXODoubleWaveform& aWaveform, EXOWaveformFT& aWaveformFT);
...
int main()
{
    EXODoubleWaveform doublewf;
    EXOWaveformFT wfFT;
    ...
    EXOFastFourierTransformFFTW::GetFFT(doublewf.GetLength()).PerformFFT(doublewf,wfFT);
...

この静的関数の使用法は、おそらく物理学者によって書かれた Geant4 にも見られるため、彼らはプログラミングで最も賢明なことをしていない可能性があります。そうすることで他の利点があるのであれば、私はまだ欲しいと思っています。

私が思っていたように、これはおそらく通常の方法ではないことがわかる前の投票から。そうなる前にコメントしてください。

4

3 に答える 3

0

関数のstatic使用法は正しいです。クラスのインスタンスがなくても、クラスから関数を使用できます。あなたが与えたFFTの例は、おそらく静的関数内にインスタンスを作成します。したがって、あなたの場合、関数Dog内でインスタンス化しGetDogます(ローカル変数への参照を返すことに注意してください!)。

于 2013-07-25T19:28:40.003 に答える
0

this作ったら使えないとおっしゃっていますがstatic、本当です。thisしかし、将来ある時点でObject インスタンスを使用する必要がある場合、なぜ Object インスタンスを使用せずにアクセスしたいのでしょうか? デフォルト値などがある場合は、関数の外部でそれを宣言してから、public staticその方法でアクセスできます。あなたが何をしているのかについてもう少し明確にしたら、それに応じてこの回答を編集/削除します。

于 2013-07-25T19:32:11.773 に答える