user1586641
user1586641

Reputation: 21

field declared void / struct or variable not declared in this scope

I've been teaching myself some OpenGL using SFML for creating windows/handling inputs, etc. My main.cpp started getting a bit unwieldy so I decided to start splitting my code up. I created a 4X_vertex.h and a 4X_vertex.cpp (4X is the name of the project) and moved the relevant functions and structs out of my main and into these files. However, when I compile, I get the error

variable or field "drawVertexArray" declared void

which from my research seems to be just an unhelpful message relating to the next error, which is

vertex was not declared in this scope

Here's my list of includes from 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"

My 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

The part of 4X_vertex.cpp that's giving me the trouble:

using namespace std;

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

All of this worked before I started moving it around so I'm assuming there's something weird going on with the includes, or something. All help is greatly appreciated!

Upvotes: 1

Views: 1376

Answers (2)

Code-Apprentice
Code-Apprentice

Reputation: 83557

You need to #include "4X_vertex.h" at the top of your 4X_vertex.cpp file. This will allow the .cpp file to see the declaration for the struct vertex.

In general, each file (both .h and .cpp files) needs to #include any header files which contain declarations for items used in that file. This includes the standard headers and OpenGL headers, as well as your custom ones.

Upvotes: 0

Les
Les

Reputation: 10605

Just some pointers. Best practice is to divide your project up into multiple source files. Typically, you would use the word "main" in the file name of the main source file (if applicable). So you might have something like...

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

For your other files, you will typically name them after the class they implement. You will most often have both a .h and a .cpp. Put your declarations in the .h and your definitions in the .cpp had have the .cpp include the .h. That might give you...

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

The modules that reference one of your classes includes it's .h as well. So, main.cpp might look like...

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

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

And feature1.cpp might be...

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

...where feature1.h declares the class, defined constants, etc. f.g.,

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

You may have noticed that tools.h is actually include twice in feature1.cpp. It is included from within the feature1.h and explicitly from the .cpp file. If you use the following pattern in your .h files ...

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

... then multiple includes shouldn't cause you any problems. And as you refactor code, it is one less thing to have to worry about cleaning up.

If you have been using a single file for all your source up till now, you may have been compiling like so...

cl main.cpp

Which gives you your .exe and .obj and maybe other files. But with multiple source files involved, it isnt much different. You can say...

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

There is much more to learn, but this is a start and helps you on the way to better organization of your coding thoughts.

Upvotes: 1

Related Questions