|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
[C++] Credo di non aver capito qualcosa riguardo alle variabili static
Il "credo" è sarcastico ovviamente
Ho un problema apparentemente molto semplice. Ho questo header: Codice:
#ifndef ENGINE
#define ENGINE
#include <glm\glm.hpp>
#include <glm\ext.hpp>
class Engine
{
public:
static glm::mat4 viewProjection;
static void Init(int width, int height);
};
#endif
Codice:
#include "stdafx.h"
#include "Engine.h"
void Engine::Init(int width, int height)
{
// The lookat function takes: eye (position of the camera), center (where the camera is pointed to), and up (top of the camera).
glm::mat4 view = glm::lookAt
(
glm::vec3(0.0, 14.0, 60.0),
glm::vec3(0.0, 0.0, -1.0),
glm::vec3(0.0, 1.0, 0.0)
);
// The perpective function takes: fovy (the lens angle), aspect (the aspect ratio), and zNear, zFar (clipping planes).
glm::mat4 projection = glm::perspective(45.0f, 1.0f * width/height, 0.1f, 70.0f);
viewProjection = projection * view;
}
Il fatto è questo, io vorrei avere una variabile statica che inizializzo attraverso un metodo statico e poi ci voglio accedere da altre classi. Mi pare di capire che questo non si possa fare, almeno non come vorrei io. Potrei non dichiarare la variabile statica come variabile di classe ed inserirla in un metodo statico GetViewProjection() tipo così: Codice:
glm::mat4 GetViewProjection()
{
static glm::mat4 viewProjection;
// se non è inizializzata la inizializzo
if( viewProjection == valore nullo )
{
//... calcoli per inizializzarla
}
return viewProjection;
}
E' giusto il mio ragionamento o ho sbagliato qualcosa? E qual è il modo corretto di procedere per una situazione del genere? |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Questo perche' il compilatore non sa "dove" allocare lo spazio per la variabile statica. Devi inizializzarla in una qualche unita' di compilazione (file .cpp) con qualcosa tipo Codice:
glm::mat4 Engine::viewProjection = <something> ; Quote:
Codice:
glm::mat4 GetViewProjection()
{
static glm::mat4 viewProjection;
static bool initialized = false;
// se non è inizializzata la inizializzo
if( !initialized )
{
initialized = true;
//... calcoli per inizializzarla
}
return viewProjection;
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
Grazie per la risposta.
Alla variabile di appoggio ci avevo pensato ma non mi entusiasmava l'idea, la soluzione era quella che hai detto per prima. Dovevo inizializzarla nel file cpp, non lo sapevo assolutamente, e dire che lo avevo studiato mesi fa ma mi ero completamente perso questo passaggio. Grazie. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:26.




















