2017-02-13 1 views
1

Ich habe eine Anwendung zweimal erstellt: einmal in Visual Studio und ein anderes Mal in XCode. Eine der Bibliotheken, die ich verwendet habe, GLFW, ermöglicht es Ihnen, die glfwSetWindowSizeCallback-Funktion zum Erkennen der Größenänderung des Fensters zu verwenden.Wie deklariert statische C++ - Funktion als Freund auf OSX

Meine Fensterklasse, Window, hat zwei private Mitglieder, Breite und Höhe. Und nach dem Aufruf meines Rückrufs, window_size_callback, wollte ich die Werte der Breite und Höhe aktualisiert werden. Allerdings wollte ich dies ohne den Einsatz von Setter tun.

Also habe ich window_size_callback einen statischen Freund gemacht. Diese Lösung funktionierte im Visual Studio-Compiler einwandfrei. XCode gab jedoch einen Fehler zurück: "statisch" ist in Freundesdeklarationen ungültig.

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 wird verwendet, um das aktuelle Fenster Instanz von außerhalb der Klasse zu erhalten.

Header-Datei:

#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); 
} 

Ohne den Freund Stichwort, window_size_callback ist nicht in der Lage, diese Elemente zuzugreifen.

Warum ist VS mit diesem und XCode nicht in Ordnung?

Und, wie kann ich das ohne Setter umgehen?

+0

Was ist der Sinn eines statischen Freundes? Freund-Funktionen gehören sowieso nicht zur Klasse ... Auch ein Code-Segment sagt mehr als tausend Worte. – DeiDei

+0

Es muss ein Freund sein, um die privaten Mitglieder meiner Klasse zu ändern, wenn das Fenster in der Größe geändert wird @DeiDei –

+0

Dann machen Sie es Freund, aber warum muss es statisch sein? – DeiDei

Antwort

1

Entfernen Sie einfach die static. Es macht keinen Sinn, wie ich in den Kommentaren erklärt habe. Hier ist ein Ausschnitt, die Dinge klar sollte:

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; 
} 

A friend Funktion kein static Mitglied einer Klasse sein kann. Ich vermute, VS erlaubt die Syntax als Erweiterung. Zählen Sie nicht darauf.

+0

Danke, Mann. Es funktioniert gut. –

Verwandte Themen