#c #opengl #static
#c #opengl #статические
Вопрос:
Я довольно новичок в C и наткнулся на следующую проблему: у меня есть структура со всеми статическими элементами, которая загружает модели в VAOs и VBO (OpenGL). Я хочу создать постоянный статический объект, который хранит информацию, необходимую для отображения VAO (Примечание: константа здесь не проблема). Проблема здесь в том, что мне приходится ждать создания контекста OpenGL и я могу вызвать функцию загрузки только после этого (моей идеей была init()
функция), но все статические переменные должны быть объявлены напрямую! (Я также пытался создать struct с нестатическими членами и просто создать статический экземпляр этой struct, но модель все еще должна быть определена в конструкторе). Любая помощь была бы отличной!
РЕДАКТИРОВАТЬ: Я также понял, что C , вероятно, хочет вообще избежать этого, поэтому мне не следует пытаться найти лазейку. Я просто ищу решение, которое также могло бы включать полную реструктуризацию того, что я сделал до сих пор.
Комментарии:
1. Проблема не в
const
объявлении, я удалил этот модификатор, но он по-прежнему не работает. Для меня на самом деле не имеет значения, является ли это константой или нет. Но спасибо за ссылку, очень интересно.
Ответ №1:
У вас есть несколько способов сделать
- иметь не статическую структуру, а статический указатель на структуру и выделять ее, когда у вас есть контекст для ее инициализации (S1 * G1 в моем примере ниже)
- обновлять структуру, когда у вас есть контекст для этого (S2 G2 в примере ниже)
Пример :
#include <iostream>
struct S1 {
S1(int v) : _v(v) {}
int _v;
};
struct S2 {
int _v;
void set(int v) { _v = v; }
};
const S1 * G1;
S2 G2;
int main()
{
int v;
std::cin >> v;
// now we are able to set the structs
G1 = new S1(v);
G2.set(v); // note G2._c is public and can be set directly too
// etc
}
Комментарии:
1. Это действительно хорошо, но я создаю этот статический указатель в отдельном методе, отличном от метода визуализации, что означало бы, что данные, которые я удалил в конце
init()
, правы?2. Это сработало! Хотя я думал
Constants* pointer = new Constants();
удалить объект Constants, на который он указывает, в конце метода. Я ошибаюсь?3. @J.Lengel Я не уверен, что понимаю вас. Вы можете смешать два решения, имеющие
S * G;
и где-тоG = new S;
и где-то послеG->init();
, чтобы инициализировать некоторые элементы, которые еще не были инициализированы при его создании4. приведет к удалению объекта Constants, на который он указывает в конце метода. почему? в форме
Constants* pointer = new Constants();
деструктор не вызывается5. Спасибо! это именно то, что мне было интересно. Полезно знать!