2016-10-27 2 views
1

Хорошо, это было покрыто уже, например, здесь: static array class variable "multiple definition" C++определение C++ Multiple

Но я пропускаю некоторые подробности здесь.

я получил следующие классы: foo.cpp

#include <iostream> 
#include "Model.h" 

    int main(int argc, char** argv){ 
     std::cout << "hello" << std::endl; 
     return 0; 
    } 

model.h

#ifndef MODEL_H 
#define MODEL_H 

#include <string> 
#include "md2Loader.h" 

class Model{ 
    public: 
    Model(); 
    Model(const std::string& model_file); 

    private: 
    md2_header_t header; 
    modelData_t model; 
}; 

#endif 

model.cpp

#include "Model.h" 
#include "md2Loader.h" 

Model::Model(){} 

Model::Model(const std::string& model_file){ 
    model = md2Loader::load_model(model_file); 
} 

и md2Loader.h

#ifndef MD2LOADER_H 
#define MD2LOADER_H 

struct modelData_t{ 
    int numVertices; 
    int numTextures; 
    // etc 
}; 

struct md2_header_t { 
    std::string version; 
}; 

class md2Loader{ 
public: 
    md2Loader(){}; 
    static modelData_t load_model(const std::string& model_file); 
}; 

modelData_t md2Loader::load_model(const std::string& model_file){ 
    modelData_t result; 
    result.numVertices = 1000; 
    result.numTextures = 10; 

    return result; 
} 


#endif 

Компонент жалуется на несколько определений. Но я не совсем уверен, почему. Не помогают ли директивы препроцессора #ifndef, #define? Я как бы понимаю, что md2Loader.h входит в модель Model.cpp и Model.h. Когда я выполняю реализацию в Model.h и оставляю Model.cpp, он будет компилироваться и связываться просто отлично. Я думал, что директивы для препроцессора предотвращают это, но, очевидно, я там что-то не хватает.

+1

вам нужно 'inline' функция, определенная в заголовочном файле – Danh

+0

_«Выполните #ifndef, директивы #define препроцессора не помочь?»_ Нет –

ответ

5

Вам необходимо либо inline функцию, определенную в файле заголовка, либо переместить ее в исходный файл. Потому что эта функция появится в нескольких единицах перевода.

inline modelData_t md2Loader::load_model(const std::string& model_file){ 
    modelData_t result; 
    result.numVertices = 1000; 
    result.numTextures = 10; 
    return result; 
} 

Смотрите больше на inline specifier

Там может быть более одного определения инлайн функции или переменной (так как C++ 17) в программе до тех пор, каждое определение появляется в другом переводе Блок. Например, встроенная функция или встроенная переменная (поскольку C++ 17) могут быть определены в заголовочном файле, который содержит # include'd в нескольких исходных файлах.

+0

спасибо! Не могли бы вы предоставить ссылку на теорию, лежащую за ней, пожалуйста. Исходя из фона Java, это иногда немного сбивает с толку ... – kimsay

+0

@kimsay добавил немного больше документации – Danh

+0

@kimsay 'inline' отмечает функцию как ОК, чтобы быть в разных единицах перевода. ODR позволяет компилятору предположить, обнаружил ли он несколько определений, что все они идентичны, и может консолидировать их. Java не имеет '# include', поэтому у вас никогда не будет проблемы в первую очередь. –

Смежные вопросы