Variável de Header ".h" nao modifica em arquivo C++ ".cpp"

a variável de titulo, altura, largura nao são modificadas no C++


CODIGO:

window.h -- ARQUIVO HEADER

#pragma once
#include "Engine.h"

class ProgramWindow
{
public:
	const char* title = "Vision Engine";
	uint32_t WIDTH = 800;
	uint32_t HEIGHT = 600;

	void initWindow()
	{
		mainWindow();
		windowLoop();
		shutdown();
	}
private:
	GLFWwindow* window;

	void mainWindow()
	{
		glfwInit();

		glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
		glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
		window = glfwCreateWindow(WIDTH, HEIGHT, title, nullptr, nullptr);
	}
	void windowLoop()
	{
		while (!glfwWindowShouldClose(window)) 
		{
			glfwPollEvents();
		}
	}
	void shutdown()
	{
		glfwDestroyWindow(window);
		glfwTerminate();
	}
};

main.cpp -- ARQUIVO C++

#include "TT_triangle.h"
#include "Window.h"
#include "Engine.h"

int main()
{
	TTtrialge trial;
	ProgramWindow window;

	trial.run();
	window.initWindow();
	window.title = "Vision Engine";
	window.WIDTH = 1920;
	window.HEIGHT = 1080;
}

Primeiramente, implementação em header não é uma boa idea. Quanto as váriáveis, elas estão mudando mas provavelmente o que não está ocorrrendo é a mudança mais a fundo no seu código:

window = glfwCreateWindow(WIDTH, HEIGHT, title, nullptr, nullptr);

Provavelmente por não haver um ‘current context OpenGL’ ou a devida configuração da viewport, de uma olhada em glfwMakeContextCurrent e glViewport

1 curtida

oi eu nao estou usando open GL estou usando VULKAN … estou usando headers para organizer o codigo
tem outra maneira ?

glViewport(o que eu coloco aqui?);

O lugar da implementação de classes e funções é em arquivo .cpp, o cabeçalho é apenas lugar da declaração do contrato/interface das classes e funções. O que você deveria fazer é criar um arquivo window.cpp.

Já que você está usando Vulkan, não vai precisar gerenciar o current context, o aconselhável é garantir o suporte a vulkan via glfwVulkanSupported, glfwGetPhysicalDevicePresentationSupport, etc
e reverter para OpenGL caso essas verificações falharem, no caso do Vulkan você precisa criar uma window surface com glfwCreateWindowSurface

De resto você está misturando APis, gl… são métodos que lidam com contextos OpenGL, por exemplo, troque glfwDestroyWindow por vkDestroySurfaceKHR

1 curtida

muinto obrigado só uma pergunta como eu faria para pegar uma variavel do .cpp
para outro .cpp

tipo no python eu pego um arquivo .py tipo float ex = 10/nao definido
eu coloco no outro .py que aquele float ex é 25

muinto obrigado mesmo eu estou usando tambem esse site de tutorial

eu sou + ou - novo em C++ começei com C# na unity

use a documentação da própria GLFW preferencialmente: Documentation index | GLFW

Você vai apenas deixar a declaração no header o header é o que “apresenta” a sua classe para o mundo exterior, ali você apenas define os métodos e variáveis públicas e só elaas são acessíveis de fora:

window.h:

...
class ProgramWindow
{
public:
	const char* title;
	uint32_t WIDTH;
	uint32_t HEIGHT;

	void initWindow();
private:
    GLFWwindow* window;
	void mainWindow();
	void windowLoop();
	void shutdown();
};

window.cpp:

#include "window.h"
 
 
void ProgramWindow::ProgramWindow() {
     this->WIDTH = ...
     this->HEIGH = ...
}

void ProgramWindow::initWindow()
{
    this->mainWindow();
    ...
}

void ProgramWindow::mainWindow()
{
    ...
}

void ProgramWindow::windowLoop()
{
    ...
}

void ProgramWindow::shutdown()
{
    ...
}

Você até pode prédefinir valores de propriedades da classe como WIDTH e tal no header, mas geralmente só se deve fazer isso se fizer sentido deixar um valor na definição do header.

1 curtida

Hmmm vou estudar isso vlw…

Bons estudos, a questão central é que implementação em header file resulta em recompilação da sua implementação toda vez que a mesma for incluída em outro arquivo.

Da mesma forma quanto mais crescer seu projeto, mais facilmente você irá esbarrar em referências circulares

Existem raros casos onde há vantagem em implementar algo no header para ajudar o compilador, mas são raros mesmo.

1 curtida

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.