Я хочу достичь «этой строки» в следующем коде. Самый логичный способ - установить GetDog static, но тогда я не могу использовать «это». Есть ли способ обойти это? (Нет, так как я пытался это, там несколько строк, не имеющие отношения к вопросу)Функция вызова без объявления класса
#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, который, вероятно, написана физиками, и поэтому они не могли бы сделать мудрую вещь в программировании. Я все еще хочу хотеть, если у этого есть другие преимущества.
От голосования вниз, прежде чем я вижу, что это, вероятно, не обычный метод, как я думал. Прокомментируйте это, прежде чем делать это.
Ваше название говорит C (почему), но помечено это C++ и использовать C++. – chris
Что означает 'C:' означает в вашей функции название –
Что именно вы спрашиваете? Какой класс, по вашему мнению, не объявлен? 'EXOFastFourierTransformFFTW' является объявленным классом в предоставленном коде, но не является классом _instantiated_. Во время выполнения нет объектов типа 'EXOFastFourierTransformFFTW', и это прекрасно, потому что вам не нужен объект этого типа для вызова статической функции' GetFFT'. Это все проверяет, но часть, которая меня интересует, заключается в том, что вызывающий код игнорирует возвращенный 'EXOFastFourierTransformFFTW &' из 'GetFFT'. Игнорирование возвращенной ссылки - плохое mojo .... – Shaz