2012-08-07 104 views
-2

我正在編寫一個簡單的着色器管理器,因此我不必一直編寫涉及着色器的複製代碼,而且遇到了一些問題,這裏是函數出現錯誤:對私有函數中私有靜態成員的未定義引用

void ShaderManager::create_program(std::string name) { 
    GLuint vertexshader; 
    GLuint fragmentshader; 

    GLint link_ok = GL_FALSE; 

    if ((vertexshader = create_shader(name + ".v.glsl", GL_VERTEX_SHADER)) == 0) { 
     print_shader_errors(&vertexshader); 
    } 

    if ((fragmentshader = create_shader(name + ".f.glsl", GL_FRAGMENT_SHADER)) == 0) { 
     print_shader_errors(&fragmentshader); 
    } 

    program_values.emplace_back(glCreateProgram()); 
    program_keys.emplace_back(name); 
    glAttachShader(program_values.at(program_values.size()), vertexshader); 
    glAttachShader(program_values.at(program_values.size()), fragmentshader); 
    glLinkProgram(program_values.at(program_values.size())); 

    glGetProgramiv(program_values.at(program_values.size()), GL_LINK_STATUS, &link_ok); 

    if (!link_ok) { 
     std::cout << "The shaders did not link correctly." << "\n"; 
    } 
} 

每一個私有靜態成員,我試圖訪問說同樣的事情:

Generator\src\ShaderManager.cpp|33|undefined reference to ShaderManager::program_values' 

我的頭文件是這樣的:

#ifndef SHADERMANAGER_H 
#define SHADERMANAGER_H 

#include <string> 
#include <vector> 

#include <GL/glew.h> 
#include <GL/glu.h> 
#include <GL/gl.h> 

class ShaderManager { 
    public: 
     ShaderManager(); 
     virtual ~ShaderManager(); 

     static GLuint get_program(std::string shader_name); 
     static int get_index_of_program_key(std::string program_name); 

     static void create_program(std::string name); 
     static bool bind_attribute(std::string shader_name, std::string attribute_name); 
     static bool bind_uniform(std::string shader_name, std::string uniform_name); 

    protected: 
    private: 
     static std::vector<GLuint> program_values; 
     static std::vector<std::string> program_keys; 

     static std::vector<GLuint> attribute_values; 
     static std::vector<std::string> attribute_keys; 

     static std::vector<GLuint> uniform_values; 
     static std::vector<std::string> uniform_keys; 


     static void print_shader_errors(GLuint *shader); 
     static const char* file_read(std::string filename); 
     static GLuint create_shader(std::string filename, GLenum type); 
}; 

#endif // SHADERMANAGER_H 
+0

我試圖訪問與ShaderManager成員:: program_values.emplace_back() - 也不起作用。 – Darestium 2012-08-07 11:25:39

+1

你是否提供源文件中所有靜態成員的定義? – 2012-08-07 11:33:59

+0

重複的http://stackoverflow.com/questions/272900/c-undefined-reference-to-static-class-member – 2012-08-07 11:37:25

回答

3

首先,你accesing program_values.at(program_values.size()),這是訪問最後一個元素之後的元素(索引從0開始不是1)和std::vector::at()函數將拋出一個out_of_range異常。 這是訪問最後一個元素的正確代碼:program_values.at(program_values.size() - 1)或更短program_values.back()

其次,如果你聲明的任何靜態成員,您需要在一個 CPP文件來定義它,就像這樣:

std::vector<GLuint> ShaderManager::program_values; 
std::vector<std::string> ShaderManager::program_keys; 

std::vector<GLuint> ShaderManager::attribute_values; 
std::vector<std::string> ShaderManager::attribute_keys; 

std::vector<GLuint> ShaderManager::uniform_values; 
std::vector<std::string> ShaderManager::uniform_keys; 
+0

「這是緩衝區溢出」它不是緩衝區溢出但超出範圍訪問,btw在()拋出當你提供錯誤索引時異常 – 2012-08-07 11:41:42

+0

是的,它會拋出out_of_range異常,它可以通過緩衝區溢出,下溢(意味着緩衝區作爲向量元素,而不是分配內存)。 – ErikEsTT 2012-08-07 11:59:43

+0

jeez !!,如果你調用緩衝區溢出/下溢那麼爲什麼沒有標準選擇out_of_range異常名稱是緩衝區溢出/下溢? – 2012-08-07 15:44:22

1

在班級定義中你只有宣稱爲靜態成員program_values。在一些.cpp文件(最好的選擇將是所有類的方法定義文件),您需要定義它 - 這樣

std::vector<GLuint> ShaderManager::program_values; 

std::vector<GLuint> ShaderManager::program_values(some_constructor_parameters);