новичок C ++ здесь еще программист.
Я использую компилятор VC ++ VS2008 и библиотеку перенасыщения.Все работает нормально и в актуальном состоянии (я знаю, что 2010 год просто cba из-за причин поддержки XNA (C #))
Хорошо, на этот раз у меня есть вопрос, связанный с кодом, но я могу заставить код работать.Что я не могу сделать, так это выяснить, что происходит под капотом.Это то, что я хотел бы выяснить.
Предположим, что все работает, потому что ясно, что во время выполнения это работает!
Вот код (сводится к минимуму того, что на самом деле работает на голом ядре, чтобы ускорить работуэто наверх)
#include "stdafx.h"
#include "Controller.h"
#include "glut.h"
#include <iostream>
void main(int argc, char** argv)
{
glutInit(&argc, argv);
//controller_ptr->InitController(); <---- no link to controller-->DrawScene
//INIT GLUT
//glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
//glutInitWindowSize(400, 400); //Set the window size
//glutCreateWindow("Some Program");
//INIT RENDERING
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutMainLoop();
}
Возможно, вы думаете, эй, у вас есть комментарий к init-коду.Я действительно делаю.Угадайте, что это все еще работает!Зачем?Я на самом деле не ЗНАЮ, что у вас есть перенасыщение, кроме как на барбекю, так что вы ... <---- Это может быть хорошей идеей для вас, чтобы вызвать сбой, если он есть </p>
У меня есть класс drawscene с этим методом
void DrawScene::initGlut()
{
//Enables depth culling/front face culling?????? <----- what about that, some depth thingy was involved is all I'm sure of
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400); //Set the window size
glutCreateWindow("Some Program");
}
Когда я комментирую это и раскомментирую один в основном, тот же результат.Я ничего не комментирую, перенасыщение говорит, что init делается дважды, я не комментирую, init не делается, все идет в гору.Таким образом, единственным логическим выводом было бы сказать, что этот метод вызывается, верно?
Существует множество других методов и классов, но нет ни класса displayescene, ни класса контроллера.Я могу прокомментировать включения, и они будут делать то же самое.
Есть ли какая-то часть дизайна, которую я не понимаю в разработке MSbuild или VC ++, которая позволяет методам просеивать какой-то поток или поток, о котором я не знаю?Насколько мне известно, если я не создаю экземпляр класса, это не актуально, по крайней мере, это нестатические члены.Итак, как этот код, будучи активным или неактивным в этом члене, может повлиять на мою программу?
Возможно, забыл что-то невероятно глупое, но я все равно предпочел бы узнать как можно скорее, хорошая роль в том, чтобы быть новичкомчто мне наплевать на то, что я упаду на лице и попытаюсь снова, так что стреляйте с комментариями ^^
Большое спасибо заранее!
РЕДАКТИРОВАТЬ: Что за?Теперь консоль без каких-либо изменений в коде действительно сообщала о двойном вызове init с основным init в комментарии, а в drawscene - без комментариев ... Я очень запутался.
EDIT 2: 14: 45 29.08.2010
Хорошо, я кое-что нашел ....
Конструктор в drawscene вызывает методы initGlut и initRendering класса.Контроллер делает указатель на кучу, содержащую там объект drawScene, что заставляет методы запускать код инициализации.
Контроллер, однако, не включен в основной и не создан.Этот код drawScene запускается перед запуском основного, и могу ли я тогда заключить, что проблема заключается в самой сборке, поэтому мне следует избегать кода инициализации в конструкторах?
РЕДАКТИРОВАТЬ 3: 15:02 29/08/2010
Найден другой, двойной вызов происходит, когда только drawScene является активным кодом инициализации.Может ли быть так, что каждое включение drawscene приводит к тому, что код конструктора запускает код инициализации и вызывает двойную инициализацию?