C++ перегружает параметр функции другого класса аргументом
Я не уверен, применяется ли здесь термин "перегрузка", но я хотел бы унаследовать класс, а затем вызвать его функцию-член без каких-либо параметров, чтобы этот параметр автоматически наследовался из текущей переменной-члена класса. Это проще объяснить в коде, поэтому я опубликую его здесь:
#include <iostream>
template <typename T>
struct Singleton {
static T & Instance() {
static T instance;
return instance;
}
T * operator -> () const {
return &Instance();
}
};
struct SFoo : Singleton<SFoo> {
void Print( int a = 0 ) {
printf( "%d\n", a );
}
};
struct SBar : SFoo {
const static int b = 42;
friend void Print( int a = b); // <- Should call SFoo::Print() with integer b as the argument
};
int main() {
using Foo = Singleton<SFoo>;
using Bar = Singleton<SBar>;
Foo()->Print( 123 ); // Should print: 123
Bar()->Print(); // Should print: 42
getchar();
return 0;
}
Я относительно новичок в наследовании и не могу понять такой простой кусок кода. Результат прямо сейчас дает в печати 123
а также 0
(аргумент по умолчанию SFoo::Print()
), чего не ожидается.
1 ответ
void Print(int a = b) { SFoo::Print(a); }
заставляет это работать, как вы указали, это также может быть:
void Print() { SFoo::Print(b); }
потому что нам не нужны две версии, которые принимают int
,
С другой стороны, вы объявляли friend
(которая не является функцией-членом). Это не было вызвано нигде в программе (Bar()->Print();
звонки SFoo::Print
), и вы не получили ошибку компоновщика из-за отсутствующего определения.