2017-02-04 2 views
2

У меня есть частный статический член C++ static класс (очень похож на одноэлементный класс, но устраняет необходимость выделения экземпляра класса, поскольку он выполняется автоматически).Инициализация статических членов класса в функции инициализации

В любом случае, я хочу инициализировать этот статический член. Как правило, один будет идти об этом, выполнив следующую

Example.h

class Example 
{ 
    private: 
    static OtherClass _value; 
    Example() {} 
}; 

Example.cpp

#include "Example.h" 
OtherClass Example::_value(constructor arguments) 

Код Сейчас я пишу не допустит этого. По сути, я пишу класс DebugDraw для OpenGL, и класс будет содержать свой собственный статический член для объекта Shader, который создаст шейдер OpenGL. Если я использую вышеуказанный метод, Shader будет создан до инициализации glew, что вызовет некоторые серьезные проблемы.

Это решение, с которым я играю.

Example.h

class Example 
{ 
    public: 
    Initialize(); 
    private: 
    static OtherClass _value; 
    Example(){} 
}; 

Example.cpp

#include "Example.h" 

Example::Initialize() 
{ 
    OtherClass _value(constructor arguments) 
    // Other code that I will need to add 
} 

Код, написанный, как это будет компилировать, но это будет иметь желаемый эффект, я ищу (инициализации члена статический класс)? Что означает среднее для статических членов перед функцией инициализации (я действительно намерен разместить там инициализированный bool)?

Благодаря

Вот фактический код, я работаю с.

DebugDraw.h

#ifndef DEBUGDRAW_H 
#define DEBUGDRAW_H 

#include <GLM\glm\vec4.hpp> 

#include "Shader.h" 

class DebugDraw 
{ 
    public: 
    static void Initialize(); 
    static void Line(); 
    static void Triangle(); 
    static void Box(); 
    static void Color(); 
    private: 
    static glm::vec4 _color; 
    static Shader _shader; 
    DebugDraw() {} 
}; 

#endif // !DEBUGDRAW_H 

DebugDraw.cpp

#include "DebugDraw.h" 

void DebugDraw::Initialize() 
{ 
    glm::vec4 _color(1.0f, 1.0f, 1.0f, 1.0f); 
    Shader _shader("Shader/debug.vert", "Shader/debug.frag"); 
    _shader.Use(); 
} 

^Это компилировать^

+0

Вы уверены, что компилируется? Отсутствует ';' после окончания объявления класса. – Raindrop7

+0

yeaym этот код был примером. Я не хотел публиковать код opengl, который я пишу. Я просто хочу знать об этом одном. – Underdisc

ответ

0

Что среднее значение для статических членов до того, как функция инициализации называется (Я собираюсь также положить туда инициализированный bool)?

Вы создаете локальную переменную _val (это должно быть _value?), Который не имеет ничего общего с вашей статической переменной. Таким образом, ваш код даже не будет связан.


Для того, чтобы делать то, что вы намерены, вы инициализирует переменную, так же, как вы показали в первом Example.cpp, но без каких-либо аргументов конструктора:

#include "Example.h" 
OtherClass Example::_value; 

Убедитесь, что конструктор без аргументов не выполняет никакой реальной инициализации! Мы собираемся отложить это, сделав метод OtherClass::initialize.

#include "Example.h" 
OtherClass Example::_value; 

Example::Initialize() 
{ 
    Example::_value.initialize(...); 
} 

В качестве альтернативы, вы можете сделать _value указатель, присвоить его NULL и передать его в куче, когда вам это нужно:

#include "Example.h" 
OtherClass *Example::_value = NULL; 

Example::Initialize() 
{ 
    Example::_value = new OtherClass(...); 
} 

Не забудьте delete, когда вы больше не нужны. Или, если вы можете использовать C++ 11, вместо этого используйте std::shared_ptr<OtherClass>.

+0

Извините, отредактировано '_val' до' _value'. Итак, что бы это значило для второй реализации (где я выполняю статическую инициализацию в функции «Example :: Initialize()»)? Я собирался использовать метод, в котором у меня есть функция Initialize в OtherClass, но были некоторые особенности, которые отталкивали меня от этого. На самом деле конструктор по умолчанию для класса просто казался плохой идеей. – Underdisc

+0

Я не уверен, что вы спрашиваете? Во второй реализации вы все равно будете использовать переменную 'static', но она будет указателем и начнется как' NULL', пока вы не установите ее в экземпляр 'OtherClass'. – Lignum

+0

Я имею в виду вторую реализацию, изложенную в первоначальном вопросе. Является '_value' в функции' Example :: Initialize() ', создавая новую переменную в стеке или инициализируя статический член' _value'. Поскольку у них одинаковый идентификатор, я не совсем уверен, что происходит. – Underdisc

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