在不声明类的情况下调用函数

时间:2013-07-25 19:27:31

标签: c++

我想在以下代码中实现“this line”。最合乎逻辑的方法是将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中,它可能是由物理学家编写的,因此他们可能不会在编程中做最明智的事情。如果这样做有其他优点,我仍然想要。

从投票结果开始,我才能看出这可能不是我认为的常规方法。请在做之前进行评论。

3 个答案:

答案 0 :(得分:0)

static函数用法是正确的 - 它允许您使用类中的函数而无需具有类的实例。您提供的FFT示例可能会在静态函数中创建一个实例。因此,在您的情况下,您将在Dog函数中实例化GetDog(只需要小心返回对局部变量的引用!)。

答案 1 :(得分:0)

你说如果你做this就不能使用static,这是真的。但是,如果您将来需要在某个时间点使用this,为什么不想使用Object实例来访问它?如果它有一个默认值或类似的东西,你可以在函数外面的其他地方声明public static,然后以那种方式访问​​它。如果你澄清一下你正在做什么,我会相应地编辑/删除这个答案。

答案 2 :(得分:0)

它似乎是 Meyers singleton 的实现。

我解释说:

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

它看起来像这个实现:

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

private:
    Singleton();
};

来自this book from Andrei Alexandrescu,据说:

  

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

     

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

     

[...]

     

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

因此,使用static从类未实例化调用方法是好的,但如果不需要则不要这样做...这里代表 Singleton模式

但现在如果你想让你的班级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 ) {}
};