85582


提示コードの各ソースファイルの`///`コメント部内部のコードですが`static`関数の実行される時なのですが  
`FrameWork`ファイルの`///`コメント部で`Camera`クラスの関数が実行されますが`Camera`クラスのインスタンスが宣言されるのは`Main`ソースファイルの`Entry`クラスの中の`Game`クラスのコンストラクタです。

##### 質問１、

なぜ宣言していないクラスの関数が使えるのでしょうか？`static`関数だからでしょうか？

##### 質問２、

`static`関数が実行されるのは`Framework`のソースファイルのコードで実行されるのでしょか？また`Camera`クラスのコンストラクタが最初に宣言される時でしょうか？

##### FrameWork

[code]

    // ##################################### フレームワークを初期化 #####################################
    void FrameWork::Init_FrameWork()
    {
        setlocale(LC_CTYPE, ""); //ローカルを設定
    
        if (FT_Init_FreeType(&ft) != 0)
        {
            std::cerr << "FreeType を初期化出来ません。" << std::endl;
            assert(0);
        }
    
        FrameWork::Sprite::Init();  //スプライト
    ///////////////////////////////////////////////////////
        FrameWork::Camera::Init();  //カメラ
    ///////////////////////////////////////////////////////
        FrameWork::Circle::Init();  //図形
        
    
    }
    
[/code]

##### Main

[code]

    #include "FrameWork/FrameWork/FrameWork.hpp"
    
    #include "Entry.hpp"
    
    int main()
    {
       
        if (glfwInit() == GL_FALSE)
        {
            std::cerr << "glfw を初期化出来ません。" << std::endl;
            assert(0);
        }
    
        
    
        std::shared_ptr<FrameWork::Window> window = FrameWork::GenWindowContext(glm::ivec2(800,600),"Game");        
        FrameWork::setCurrentContext(window);
        
    
    
    
        if (glewInit() != GLEW_OK)
        {
            std::cerr << "glew を初期化出来ません。" << std::endl;
            assert(0);
        }
    
    
    
    
        FrameWork::Init_FrameWork();
    ///////////////////////////////////////////////////////////////////
        std::unique_ptr<Entry> entry = std::make_unique<Entry>();
    ///////////////////////////////////////////////////////////////////
        while (*window)
        {
            entry->Loop();
    
            window->SwapBuffers();
        }
        
    
    
    
    
        return 0;
    }
    
[/code]

##### Game

[code]

    Game::Game() : Scene(Sequence::Game)
    {
        camera = std::make_shared<FrameWork::Camera>();
        canvas = std::make_shared<Canvas>();
        control = std::make_shared<Control>();
    
        std::vector<std::string> texture;
        texture.push_back("texture/skybox/left.jpg");
        texture.push_back("texture/skybox/top.jpg");
        texture.push_back("texture/skybox/bottom.jpg");
        texture.push_back("texture/skybox/front.jpg");
        texture.push_back("texture/skybox/back.jpg");
    
    ///////////////////////////////////////////////////////////////
        GLuint t = FrameWork::LoadTexture_CubeMap(texture);
    ///////////////////////////////////////////////////////////////
        
      //  camera->setSkyBox(t);
    
        canvas->camera = camera;
        canvas->control = control;
    
        control->setCamera(camera);
    
    }
    
[/code]

##### Camera

[code]

    // ##################################### static 初期化　##################################### 
    void FrameWork::Camera::Init()
    {
    ///////////////////////////////////////////////////////////////
    //  printf("Init()\n");
    ///////////////////////////////////////////////////////////////
    
        //レンダリングポリゴン
        glGenVertexArrays(1, &quadVAO);
        glGenBuffers(1, &quadVBO);
    
        shader = std::make_shared<FrameWork::Shader>();
        shader->Load("shader/FrameBuffer.vert", "shader/FrameBuffer.frag");
    
        shader->setEnable();
        glBindVertexArray(quadVAO);
        glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
    
        glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), &quad, GL_STATIC_DRAW);
    
        GLuint attrib = shader->getAttribLocation("vertexPosition");
        glEnableVertexAttribArray(attrib);
        glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
        shader->setBindAttribLocation("vertexPosition");
    
        attrib = shader->getAttribLocation("vertexUV");
        glEnableVertexAttribArray(attrib);
        glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
        shader->setBindAttribLocation("vertexUV");
    
        shader->setDisable();
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);   
    
        frameBufferNumber = 0;
    }
    
    // ##################################### 初期化　##################################### 
    FrameWork::Camera::Camera()
    {       
    
        
    
        //MSAA バッファ
        glGenFramebuffers(1, &frameBufferFBO);  
        glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO);  
        glGenTextures(1, &frameBuffer);
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, frameBuffer);
        glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB, windowContext->getSize().x, windowContext->getSize().y, GL_TRUE);
    
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + frameBufferNumber, GL_TEXTURE_2D_MULTISAMPLE, frameBuffer, 0);
        
    
        //レンダリングバッファ
        glGenRenderbuffers(1, &rbo);
        glBindRenderbuffer(GL_RENDERBUFFER, rbo);
        glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, windowContext->getSize().x, windowContext->getSize().y);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
    
        //MSAA　アタッチ
        GLuint attachment = GL_COLOR_ATTACHMENT0 + frameBufferNumber;
        glDrawBuffers(1,&attachment);
        
    
        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        {
            std::cerr << "Framebuffer is not complete: 0x" << glCheckFramebufferStatus(GL_FRAMEBUFFER) << std::endl;
            assert(0);
        }
        glBindFramebuffer(GL_FRAMEBUFFER,0);
    
    
        //深度マップ
        glGenFramebuffers(1, &depthMapFBO);
        glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
        glGenTextures(1, &depthMap);
        glBindTexture(GL_TEXTURE_2D, depthMap);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, windowContext->getSize().x, windowContext->getSize().y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);
    
        //カラーバッファ
        glGenFramebuffers(1, &colorBufferFBO);
        glBindFramebuffer(GL_FRAMEBUFFER, colorBufferFBO);
        glGenTextures(1, &colorBuffer);
        glBindTexture(GL_TEXTURE_2D, colorBuffer);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, windowContext->getSize().x, windowContext->getSize().y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + frameBufferNumber, GL_TEXTURE_2D, colorBuffer, 0);    // we only need a color buffer
    
        
    
        /*
        //スカイボックス
        skyBoxShader = std::make_shared<FrameWork::Shader>();
    
        glGenVertexArrays(1, &skyBoxVAO);
        glGenBuffers(1, &skyBoxVBO);
    
        skyBoxShader->Load("shader/SkyBox.vert", "shader/SkyBox.frag");
    
        skyBoxShader->setEnable();
        glBindVertexArray(skyBoxVAO);
        glBindBuffer(GL_ARRAY_BUFFER, skyBoxVBO);
    
        glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float) * 36, &skyboxVertices, GL_STATIC_DRAW);
    
        GLuint attrib = skyBoxShader->getAttribLocation("vertexPosition");
        glEnableVertexAttribArray(attrib);
        glVertexAttribPointer(attrib, 1, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        skyBoxShader->setBindAttribLocation("vertexPosition");
    
        skyBoxShader->setDisable();
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        */
    
    
    
    
        position = glm::vec3(0,0,10);   //座標
        vecLook = glm::vec3(0,0,-1);    //向き
    
        setPosition(position);
        setLook(vecLook);
    
        frameBufferNumber += 1;
    }
    
    
    
[/code]


CC BY-SA 4.0
2022-01-09T04:36:21.473
85576
2022-01-09T09:30:49.590
question
c++
c++ staticメンバ関数の実行される時が知りたい。


> なぜ宣言していないクラスの関数が使えるのでしょうか？

そもそも「宣言」を正しく理解していない可能性があります。C++言語には「宣言」と「定義」が存在します。次のような記述となります。

[code]

    // 宣言
    namespace Framework {
      class Camera {
        ...
        void Init();
        ...
      };
    }
    
[/code]

[code]

    // 定義
    namespace Framework {
      void Camera::Init() {
        ...
      }
    }
    
[/code]

[code]

    // 宣言と定義を同時に行う
    namespace Framework {
      class Camera {
        ...
        void Init() {
          ...
        }
        ...
      };
    }
    
[/code]

その上で、「宣言」と「定義」を混同されていると思われます。本当に宣言されていない場合はコンパイルエラーとなります。コンパイルに成功していることから`FrameWork::Init_FrameWork()`の当該行より手前に「宣言」は存在するのではないでしょうか？

* * *

> `static`関数が実行されるのはFrameworkのソースファイルのコードで実行されるのでしょか？

質問の意図が理解できませんでした。特別なことは何もありません。`FrameWork::Init_FrameWork()`関数が呼び出され、その中で`FrameWork::Sprite::Init();`が実行し終わった後で`FrameWork::Camera::Init();`が実行されます。


CC BY-SA 4.0
2022-01-09T09:30:49.590
85582
2022-01-09T09:30:49.590
4236
85576
answer