Указатель на функцию как функция друга
Я использую указатели на функции в классе, чтобы обеспечить расширяемую функциональность во время выполнения.
У меня есть typedef'd подпись функции:
typedef f32 generate_height(f32 x, f32 y);
Теперь в классе я использую указатели на функции:
class TerrainChunk
{
...
private:
generate_height *heightgen;
...
}
Мне бы хотелось, чтобы указателю этой функции был разрешен доступ к закрытым атрибутам TerrainChunk. Я мог бы передать их, но для разных функций могут потребоваться разные атрибуты - например, мне может понадобиться доступ к сетке ландшафта в одних функциях или к расположению местности в других. Таким образом, это быстро стало бы очень большой сигнатурой функции, которая не является ни идеальной, ни расширяемой.
Я попытался поместить ключевое слово друга в разные места, но это не помогло.
Любые предложения о том, как я мог бы достичь этой функциональности?
1 ответ
Вы не можете сделать указатель на функцию другом TerrainChunk
, Вы можете сделать функции друг TerrainChunk
,
Это означает, что вы можете сделать только ограниченный набор функций друзей. Вы не можете загрузить произвольную функцию во время выполнения и иметь возможность читать приватные части TerrainChunk
,
Как предполагает Some programmer dude, обходной путь заключается в передаче ссылки (или указателя) на (const) TerrainChunk
к функции, и дать TerrainChunk
достаточно общественных функций доступа, что generate_height
Функции могут получить всю необходимую им информацию.
(Вы можете сделать аксессоры встроенными, так что это не приведет к снижению производительности).