gpt4 book ai didi

c++ - 多重定义 C++

转载 作者:行者123 更新时间:2023-11-30 01:09:27 24 4
gpt4 key购买 nike

好的,这已经涵盖了,例如这里:static array class variable "multiple definition" C++

但我在这里遗漏了一些细节。

我有以下类(class):Foo.cpp

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

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

模型.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

模型.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 时,它将编译和链接得很好。我想,预处理器的指令可以防止这种情况发生,但显然我在那里遗漏了一些东西。

最佳答案

您需要内联 头文件中定义的函数或将其移动到源文件中。因为那个函数会出现在多个翻译单元中。

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

查看更多信息 inline specifier

There may be more than one definition of an inline function or variable (since C++17) in the program as long as each definition appears in a different translation unit. For example, an inline function or an inline variable (since C++17) may be defined in a header file that is #include'd in multiple source files.

关于c++ - 多重定义 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com