Указатель на функцию как функция друга

Я использую указатели на функции в классе, чтобы обеспечить расширяемую функциональность во время выполнения.

У меня есть 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 Функции могут получить всю необходимую им информацию.

(Вы можете сделать аксессоры встроенными, так что это не приведет к снижению производительности).

Другие вопросы по тегам