2017-02-13 1 views
1

Я создал приложение дважды: один раз в Visual Studio и еще раз в XCode. Одна из библиотек, которые я использовал, GLFW, позволяет использовать функцию glfwSetWindowSizeCallback для определения изменения размера окна.Как объявить статическую функцию C++ как друга в OSX

Мой класс окна, Window, имеет два частных члена, ширину и высоту. И после вызова моего обратного вызова, window_size_callback, я хотел, чтобы значения ширины и высоты были обновлены. Однако я хотел сделать это без использования сеттеров.

Итак, я сделал window_size_callback статическим другом. Это решение отлично работало в компиляторе Visual Studio; однако XCode возвратил ошибку: «static» недействителен в объявлениях друзей.

window_size_callback:

void window_size_callback(GLFWwindow* window, int width, int height) { 
    Window* win = (Window*)glfwGetWindowUserPointer(window); 
    win->width = width; 
    win->height = height; 
} 

glfwGetWindowUserPointer используется для получения текущего экземпляра окна из-за пределов класса.

заголовок файл:

#include <GLFW/glfw3.h> 

class Window { 
private: 
    int m_width; 
    int m_height; 
private: 
    friend static void window_size_callback(GLFWwindow* window, int width, int height); 
} 

Без друга ключевого слова, window_size_callback не в состоянии получить доступ к этим членам.

Почему VS отлично с этим и XCode нет?

И как я могу обойти это без использования сеттеров?

+0

Какой смысл статического друга? Друг-функции в любом случае не являются частью класса ... Также сегмент кода стоит тысячи слов. – DeiDei

+0

Он должен быть другом, чтобы изменить закрытых членов моего класса при изменении размера окна @DeiDei –

+0

Затем сделайте его другом, но зачем он должен быть статичным? – DeiDei

ответ

1

Просто удалите static. Это не имеет смысла, как я объяснил в комментариях. Вот отрывок, который должен очистить вещи:

class Window { 
private: 
    int m_width; 
    int m_height; 
private: 
    friend void window_size_callback(GLFWwindow*, int, int); 
}; 

// as you can see 'window_size_callback' is implemented as a free function 
// not as a member function which is what 'static' implies 
void window_size_callback(GLFWwindow* window, int width, int height) { 
    Window* win = (Window*)glfwGetWindowUserPointer(window); 
    win->width = width; 
    win->height = height; 
} 

friend функция не может быть static членом класса. Я предполагаю, что VS разрешает синтаксис как расширение. Не рассчитывайте на это.

+0

Спасибо, мужик. Он работает красиво. –

Смежные вопросы