1

我一直在自学一些使用 SFML 来创建窗口/处理输入等的 OpenGL。我的 main.cpp 开始变得有点笨拙,所以我决定开始拆分我的代码。我创建了一个 4X_vertex.h 和一个 4X_vertex.cpp(4X 是项目的名称),并将相关的函数和结构从我的主文件中移出并放入这些文件中。但是,当我编译时,我得到了错误

variable or field "drawVertexArray" declared void

根据我的研究,这似乎只是与下一个错误有关的无用信息,即

vertex was not declared in this scope

这是我的列表中包含的内容main.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "4x_vertex.h"
#include "4x_constants.h"

我的4X_vertex.h

#ifndef _4X_VERT_H
#define _4X_VERT_H
struct vertex{
        GLfloat x,y,z;
        GLfloat r,g,b;
};
void drawVertexArray(vertex v[]);
vertex* loadVertexData();
#include "4X_vertex.cpp"
#endif

这部分4X_vertex.cpp给我带来了麻烦:

using namespace std;

void drawVertexArray(vertex v[]){
    ... openGL stuff...
}

在我开始移动它之前,所有这些都起作用了,所以我假设包含的东西有些奇怪,或者其他什么。非常感谢所有帮助!

4

2 回答 2

1

只是一些指针。最佳实践是将您的项目分成多个源文件。通常,您会在主源文件的文件名中使用“main”一词(如果适用)。所以你可能有类似...

main.cpp
feature1.cpp
feature2.cpp
tools.cpp

对于您的其他文件,您通常会在它们实现的类之后命名它们。您通常会同时拥有 .h 和 .cpp。将您的声明放在 .h 中,并且您在 .cpp 中的定义使 .cpp 包含 .h。那可能会给你...

main.cpp
feature1.cpp    feature1.h
feature2.cpp    feature2.h
tools.cpp       tools.h

引用您的类之一的模块也包括它的 .h。所以,main.cpp 可能看起来像......

#include <iostream>
#include "feature1.h"
#include "feature2.h"

using namespace std;
void main(int argc, char **argv)
{ ...
    cout << "Done!\n";
}

而 feature1.cpp 可能是......

#include "feature1.h"
#include "tools.h"
feature1_class::feature1_class() { ... }
void feature1_class::AUsefulFeature(int val) { ... }
//etc.

...其中 feature1.h 声明了类、定义的常量等 fg,

#ifndef FEATURE1
#define FEATURE1
#include "tools.h"
class feature1_class
{
public:
    feature1_class();
    void AUsefulFeature(int val);
    int APublicMember;
};
#endif

您可能已经注意到,tools.h 实际上在 feature1.cpp 中包含了两次。它包含在 feature1.h 中,并明确地包含在 .cpp 文件中。如果您在 .h 文件中使用以下模式...

#ifndef TOOLS_H
#define TOOLS_H
//... do your thing
#endif

...那么多个包含不应该给您带来任何问题。而且当你重构代码时,不必担心清理的事情就更少了。

如果到目前为止您一直在为所有源代码使用单个文件,那么您可能一直在编译...

cl main.cpp

这为您提供了 .exe 和 .obj 以及其他文件。但是涉及到多个源文件,它并没有太大的不同。你可以说...

cl main.cpp feature1.cpp feature2.cpp tools.cpp

还有很多东西要学,但这是一个开始,可以帮助你更好地组织你的编码思想。

于 2012-08-10T20:18:12.843 回答
0

您需要#include "4X_vertex.h"在文件的顶部4X_vertex.cpp。这将允许.cpp文件查看struct vertex.

通常,每个文件(.h 和 .cpp 文件)都需要#include包含该文件中使用的项目声明的任何头文件。这包括标准头文件和 OpenGL 头文件,以及您的自定义头文件。

于 2012-08-10T20:33:15.967 回答