Mientro static dentro de clase static, simbolo externo sin resolver

Iniciado por patilanz, 7 Septiembre 2016, 23:27 PM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

Hola,
en este código
Código (cpp) [Seleccionar]
class mainMenu{
public:
static enum menuResult { Nothing, Play, Instruction, About, Exit };
static class menuItem{
public:
menuItem(char * name = "");
menuItem(char * name, mainMenu::menuResult action);
char * name;
mainMenu::menuResult action;
sf::Rect<int> rect;
int fontSize = 24;
void draw(sf::RenderWindow & window);

static mainMenu * mainMenuPointer; // problem
private:
bool created = false;
// draw items
sf::Text text;
sf::RectangleShape outline;
};

std::vector<menuItem> items;

sf::Font font;
void drawItems(sf::RenderWindow & window);
//menuResult handleClick();
};




La variable mainMenuPointer o cualquier variable estática dentro de la clase estática menuItem muestra el error de símbolo externo sin resolver 2001 en visual studio 2013
Alguien sabe porqué?

Un saludo

class_OpenGL

Los problemas se resume en que en C++, el uso de la palabra static no es el mismo que en Java. En C++ no puedes tener clases estáticas usando static al principio de la clase. La palabra static en C++ solo se puede poner detrás de la declaración y definición de variables o métodos (hablando dentro de POO). Por ello, tampoco puedes hacer static enum menuResult [...]; Eso no está permitido

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

patilanz

#2
Cita de: class_OpenGL en  8 Septiembre 2016, 08:35 AM
Los problemas se resume en que en C++, el uso de la palabra static no es el mismo que en Java. En C++ no puedes tener clases estáticas usando static al principio de la clase. La palabra static en C++ solo se puede poner detrás de la declaración y definición de variables o métodos (hablando dentro de POO). Por ello, tampoco puedes hacer static enum menuResult [...]; Eso no está permitido

Lo raro es que
Código (cpp) [Seleccionar]
static enum menuResult { Nothing, Play, Instruction, About, Exit };
si que funciona


En realidad lo que intento hacer es que una vez creada la clase A, todos los objetos con tipo clase B creados tengan un puntero apuntando a clase A sin necesidad de asignar la dirección en cada objeto nuevo creado

ivancea96

Bueno, static no es la palabra que buscas, es todo. static de hecho, hace algo totalmente opuesto a lo que buscas. Los miembros declarados como static no pertenecen a cada objeto, sino que pertenecen a la clase en sí.

En cualquier caso, una opción es poner una función en la clase menuItem que agregue el elemento al vector y que le asigne su dirección.
A menuItem le quitarías la palabra static, y lo pondrías fuera o dentro de la clase mainMenu, como quieras.
Luego, mainMenuPointer no puede ser static. Si es static, al cambiarlo, "cambiará en todos los objetos menuItem". Eso significa que funcionaría si solo quisieras tener 1 único mainMenu.