1

ウィンドウの作成や入力の処理などに SFML を使用して OpenGL を独習してきました。4X_vertex.h と 4X_vertex.cpp (4X はプロジェクトの名前) を作成し、関連する関数と構造体をメインからこれらのファイルに移動しました。ただし、コンパイルするとエラーが発生します

variable or field "drawVertexArray" declared void

私の調査によると、これは次のエラーに関連する役に立たないメッセージにすぎないようです。

vertex was not declared in this scope

my からのインクルードのリストは次の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

クラスの 1 つを参照するモジュールには、.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 に 2 回インクルードされています。これは、feature1.h 内から、および .cpp ファイルから明示的に含まれています。.h ファイルで次のパターンを使用すると ...

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

...複数のインクルードが問題を引き起こすことはありません。また、コードをリファクタリングすると、クリーンアップについて心配する必要が 1 つ減ります。

これまで、すべてのソースに対して単一のファイルを使用していた場合、次のようにコンパイルしていた可能性があります...

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 に答える