0

我想在下面的代码中实现“这一行”。最合乎逻辑的方法是将 GetDog 设置为静态,但是我不能使用“this”。有没有办法绕过它?(不,因为我正在尝试,有几行与问题无关)

#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 示例可能在静态函数中创建了一个实例。因此,在您的情况下,您将DogGetDog函数内实例化(请注意返回对局部变量的引用!)。

于 2013-07-25T19:28:40.003 回答
0

你说this如果你做了就不能使用static,这是真的。但是,如果您将来需要使用 Object 实例,为什么要在不使用 Object 实例的情况下访问它this呢?如果它有一个默认值,或者类似的东西,你可以在函数之外的其他地方声明public static它,然后以这种方式访问​​它。如果您对自己在做什么做出更多澄清,我将相应地编辑/删除此答案。

于 2013-07-25T19:32:11.773 回答
0

似乎它是Meyers singleton的实现。

我解释 :

在给出的示例中,该类EXOFastFourierTransformFFTW似乎没有构造函数,而是返回对EXOFastFourierTransformFFTW对象的引用。

它看起来像这样的实现:

class Singleton
{
public:
    static Singleton& Instance()
    {
        static Singleton obj;
        return obj;
    }

private:
    Singleton();
};

Andrei Alexandrescu的这本书中说:

这个简单而优雅的实现首先由Scott Meyers发布;因此,我们将其称为Meyers Singleton

Meyers 单例依赖于一些编译器魔法。函数静态对象在控制流首次传递其定义时被初始化。不要混淆在运行时初始化的静态变量[...]

[...]

此外,编译器生成代码,以便在初始化后,运行时支持注册变量以进行销毁。

因此,最好使用静态从未实例化的类中调用方法,但如果没有必要,请不要这样做……这里表示您必须使用的单例模式

但是现在,如果您希望您的课程Dog看起来像这样:

class Dog
{
public:
    static Dog& GetDog(int k)
    {
        static Dog obj( k );
        return obj;
    }
    int bark()
    {
        return a*a;
    }
private:
    int a;
    Dog( int iA ) : a( iA ) {}
};
于 2013-07-25T20:14:39.813 回答