我想在以下代码中实现“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中,它可能是由物理学家编写的,因此他们可能不会在编程中做最明智的事情。如果这样做有其他优点,我仍然想要。
从投票结果开始,我才能看出这可能不是我认为的常规方法。请在做之前进行评论。
答案 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 ) {}
};