Так как люди одержимы понижением, вот краткое изложение:
Вы можете получить доступ к нестатическому члену из статической функции-члена при условии, что вы передадите экземпляр класса ИЛИ указатель на него ИЛИ ссылку. Квалификация объекта (другими словами, статическая подпись члена) будет определять, можете ли вы вызывать только const
или обе функции-члена const
и non-const
изнутри.
Нестатические данные / функции-члены опираются на указатель this
- который в основном является указателем на объект, обращающийся к / вызывающий данные / функцию-члена. Статика является уровнем класса и не связана с отдельными объектами. Однако, если вы передаете ссылку / указатель экземпляра класса / или самого экземпляра статической функции, вы можете сделать вызов.
#include <iostream>
struct Eg {
Eg() : x(42), y(-42) {}
static void foo(Eg const&f) {
std::cout << "foo\n";
f.bar();
// we are good -- x is mutable
std::cout << f.x << std::endl;
f.x = 24;
std::cout << f.x << std::endl;
std::cout << f.y << std::endl;
// you need non-const access for the following
// so they don't work -- see foo signature
//f.y = -24; compile error -- const l-value
// f.barbar(); same as above
}
void bar() const { // const required since we have a const reference
std::cout << "bar\n";
}
void barbar() { // const required since we have a const reference
std::cout << "bar\n";
}
// note well the members
mutable int x;
int y;
};
int main() {
Eg ex;
Eg::foo(ex); // or ex.foo(ex);
}
Посмотрите на шаблон метода Singleton / factory - они будут вам интересны.