Jump to content
  • Advertisement
Sign in to follow this  
Lempface

C++ and Headers/includes.

This topic is 4395 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm having trouble understanding this, I have a header global.h which has all my global variables and constants, I want these to be available to some of my classes and functions (stored in their own cpp) but if I include the header in the .cpp containing said functions or constants my compiler says I've declared the variables/constants from the header file have been defined as many times as I've included them, even with #ifndef. [/run on] I'm sure I'm just doing something wrong here, any tips would be great.

Share this post


Link to post
Share on other sites
Advertisement
Hmm, I'm not sure if you read that entire article thoroughly. Here's a tested example(code::blocks with mingw)

globals.h

#ifndef GLOBALS_H_
#define GLOBALS_H_

extern int alpha;
extern int beta;

#endif


globals.cpp

#include "globals.h"

int alpha = 0;
int beta = 1;


main.cpp

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

int main()
{
std::cout << alpha << " " << beta << std::endl;
return 0;
}

Share this post


Link to post
Share on other sites
Yea, that is precisely what I have.. let me post my code.

global.h

#ifndef GLOBAL_H_
#define GLOBAL_H_

#include <allegro.h>
#include <alpng.h>
#include <stdlib.h>

//#define MODE GFX_AUTODETECT_WINDOWED
#define MODE GFX_AUTODETECT_FULLSCREEN
#define SCREENW 640
#define SCREENH 480
#define BALLSPEED 3
#define PADDLESPEED 2

//Colors
#define RED makecol(235, 0 ,0)
#define BLUE makecol(0, 0, 225)
#define WHITE makecol(255, 255 ,255)

//Paddlesize
#define PADDLEW 29
#define PADDLEH 5

//Ballsize
#define BALLW 3
#define BALLH 3

/*
Gameload = 0
Gamepause = 1
Gameon = 10
Gamequit = 100
*/

extern int gamestate;

extern int random;

BITMAP *buffer;

extern struct paddleTag {
int x, y;
int dir;
int color, score;
} paddles[2];

extern struct ballTag {
int x, y;
int xspeed, yspeed;
int color;
int status; // 0 = dead, 1 = alive
} balls;

extern struct moveTag {
int x, y;
} move;

#endif




Draw.h

#ifndef DRAW_H_
#define DRAW_H_
#include "global.h"

class eraseClass;

class drawClass {
private:
void draw(int, int, int);
int x, y;
int objtype;
public:
void ball();
void paddle(int);
void screens();
friend class eraseClass;
} draw;

#endif




Draw.cpp

//Draw some fun stuff on the screen
#include "draw.h"

/* Main draw function.
This function will determine if it should
draw a ball, or a paddle and then do so. */

void drawClass::draw(int num, int objtype, int color) {
if(objtype == 1)
{
x = paddles[num].x;
y = paddles[num].y;
rectfill(buffer, x - PADDLEW, y - PADDLEH, x + PADDLEW, y + PADDLEH, color);
}
else if (objtype == 2)
{
if (balls.status == 1)
{
x = balls.x;
y = balls.y;
rectfill(buffer, x - BALLW, y + BALLH, x + BALLW, y - BALLH, color);
}
}
}

/* Passes the required variables
to draw.draw() to draw a paddle. */

void drawClass::paddle(int num) {
draw(num, 1, paddles[num].color);
}

/* Passes the required variables
to draw.draw() to draw a ball. */

void drawClass::ball() {
draw(1, 2, balls.color);
}

//Blits all the new drawings to the buffer.
void drawClass::screens() {
blit(buffer, screen, 0, 0, 0, 0, 640, 480);
}




Main.cpp

/* Ba-BOUNCE! */
////////////////

#include "global.h"
#include "ai.h"
#include "draw.h"
#include "erase.h"
#include "init.h"
#include "move.h"
#include "titlescreen.h"
#include "getinput.h"
#include "shutdown.h"


using namespace std;

int main(void) {
init.startup();

titlescreen();

init.game();

while (gamestate == 10) {
erase.paddle(0);
erase.paddle(1);

erase.ball();

motion.paddle(0);
motion.paddle(1);

motion.ball();

draw.paddle(0);
draw.paddle(1);

draw.ball();

getinput();
ai();

if(balls.status == 0) {
init.nextround();
}

draw.screens();

rest(10);

}
shutdown();
return 1;

}
END_OF_MAIN();

Share this post


Link to post
Share on other sites
Quote:
Original post by Lempface
global.h
BITMAP *buffer;


Also needs to be extern'd. Post the actual compile errors that you get.

-me

Share this post


Link to post
Share on other sites
init.o(.bss+0x0):init.cpp: multiple definition of `init'
main.o(.bss+0xd):main.cpp: first defined here
init.o(.bss+0x4):init.cpp: multiple definition of `draw'
main.o(.bss+0x0):main.cpp: first defined here
init.o(.bss+0x10):init.cpp: multiple definition of `erase'
main.o(.bss+0xc):main.cpp: first defined here
draw.o(.bss+0x0):draw.cpp: multiple definition of `draw'
main.o(.bss+0x0):main.cpp: first defined here

erase.o(.bss+0x0):erase.cpp: multiple definition of `erase'
main.o(.bss+0xc):main.cpp: first defined here
erase.o(.bss+0x4):erase.cpp: multiple definition of `draw'
main.o(.bss+0x0):main.cpp: first defined here
move.o(.bss+0x0):move.cpp: multiple definition of `motion'
main.o(.bss+0x10):main.cpp: first defined here
main.o(.text+0x25):main.cpp: undefined reference to `gamestate'
main.o(.text+0xd8):main.cpp: undefined reference to `balls'
init.o(.text+0x8e):init.cpp: undefined reference to `buffer'
init.o(.text+0x94):init.cpp: undefined reference to `gamestate'

init.o(.text+0x123):init.cpp: undefined reference to `paddles'

init.o(.text+0x129):init.cpp: undefined reference to `paddles'

init.o(.text+0x133):init.cpp: undefined reference to `paddles'

init.o(.text+0x13d):init.cpp: undefined reference to `paddles'

init.o(.text+0x147):init.cpp: undefined reference to `paddles'

init.o(.text+0x16c):init.cpp: more undefined references to `paddles' follow
init.o(.text+0x1b5):init.cpp: undefined reference to `balls'
init.o(.text+0x1bb):init.cpp: undefined reference to `balls'
init.o(.text+0x1c5):init.cpp: undefined reference to `balls'
init.o(.text+0x1cf):init.cpp: undefined reference to `balls'
init.o(.text+0x1d9):init.cpp: undefined reference to `balls'
init.o(.text+0x1e3):init.cpp: more undefined references to `balls' follow
init.o(.text+0x200):init.cpp: undefined reference to `random'
init.o(.text+0x205):init.cpp: undefined reference to `random'
init.o(.text+0x210):init.cpp: undefined reference to `random'
init.o(.text+0x216):init.cpp: undefined reference to `random'
init.o(.text+0x21f):init.cpp: undefined reference to `move'
init.o(.text+0x22b):init.cpp: undefined reference to `move'
init.o(.text+0x251):init.cpp: undefined reference to `random'
init.o(.text+0x256):init.cpp: undefined reference to `random'
init.o(.text+0x261):init.cpp: undefined reference to `random'
init.o(.text+0x267):init.cpp: undefined reference to `random'

init.o(.text+0x270):init.cpp: undefined reference to `move'
init.o(.text+0x27a):init.cpp: undefined reference to `move'
init.o(.text+0x286):init.cpp: undefined reference to `move'
init.o(.text+0x290):init.cpp: undefined reference to `move'
init.o(.text+0x2ca):init.cpp: undefined reference to `balls'
init.o(.text+0x2d4):init.cpp: undefined reference to `balls'

init.o(.text+0x2de):init.cpp: undefined reference to `balls'
init.o(.text+0x2e8):init.cpp: undefined reference to `paddles'
init.o(.text+0x2f2):init.cpp: undefined reference to `paddles'
init.o(.text+0x2fc):init.cpp: undefined reference to `paddles'
init.o(.text+0x306):init.cpp: undefined reference to `paddles'
init.o(.text+0x352):init.cpp: undefined reference to `buffer'
init.o(.text+0x37d):init.cpp: undefined reference to `paddles'
init.o(.text+0x386):init.cpp: undefined reference to `paddles'
init.o(.text+0x3b6):init.cpp: undefined reference to `buffer'
init.o(.text+0x412):init.cpp: undefined reference to `buffer'
draw.o(.text+0x1e):draw.cpp: undefined reference to `paddles'
draw.o(.text+0x36):draw.cpp: undefined reference to `paddles'
draw.o(.text+0x77):draw.cpp: undefined reference to `buffer'
draw.o(.text+0x8d):draw.cpp: undefined reference to `balls'
draw.o(.text+0x98):draw.cpp: undefined reference to `balls'
draw.o(.text+0xa2):draw.cpp: undefined reference to `balls'
draw.o(.text+0xe3):draw.cpp: undefined reference to `buffer'
draw.o(.text+0x143):draw.cpp: undefined reference to `paddles'
draw.o(.text+0x16f):draw.cpp: undefined reference to `balls'
draw.o(.text+0x1d6):draw.cpp: undefined reference to `buffer'
getinput.o(.text+0x12):getinput.cpp: undefined reference to `gamestate'
getinput.o(.text+0x2b):getinput.cpp: undefined reference to `paddles'
getinput.o(.text+0x44):getinput.cpp: undefined reference to `paddles'

getinput.o(.text+0x50):getinput.cpp: undefined reference to `paddles'
ai.o(.text+0x4):ai.cpp: undefined reference to `balls'
ai.o(.text+0xa):ai.cpp: undefined reference to `paddles'
ai.o(.text+0x12):ai.cpp: undefined reference to `paddles'
ai.o(.text+0x1d):ai.cpp: undefined reference to `balls'
ai.o(.text+0x23):ai.cpp: undefined reference to `paddles'
ai.o(.text+0x2b):ai.cpp: undefined reference to `paddles'
ai.o(.text+0x37):ai.cpp: undefined reference to `paddles'
move.o(.text+0x56):move.cpp: undefined reference to `move'
move.o(.text+0x5c):move.cpp: undefined reference to `move'
move.o(.text+0x68):move.cpp: undefined reference to `move'
move.o(.text+0x95):move.cpp: undefined reference to `move'
move.o(.text+0xb6):move.cpp: undefined reference to `paddles'
move.o(.text+0xdd):move.cpp: undefined reference to `paddles'
move.o(.text+0xe6):move.cpp: undefined reference to `paddles'
move.o(.text+0xff):move.cpp: undefined reference to `paddles'
move.o(.text+0x126):move.cpp: undefined reference to `paddles'
move.o(.text+0x12f):move.cpp: more undefined references to `paddles' follow
move.o(.text+0x1ba):move.cpp: undefined reference to `balls'
move.o(.text+0x1c6):move.cpp: undefined reference to `balls'
move.o(.text+0x1d1):move.cpp: undefined reference to `balls'
move.o(.text+0x1db):move.cpp: undefined reference to `balls'
move.o(.text+0x1e7):move.cpp: undefined reference to `paddles'
move.o(.text+0x1ed):move.cpp: undefined reference to `balls'
move.o(.text+0x1fa):move.cpp: undefined reference to `paddles'
move.o(.text+0x204):move.cpp: undefined reference to `paddles'
move.o(.text+0x20d):move.cpp: undefined reference to `balls'
move.o(.text+0x214):move.cpp: undefined reference to `paddles'
move.o(.text+0x21d):move.cpp: undefined reference to `balls'
move.o(.text+0x224):move.cpp: undefined reference to `paddles'
move.o(.text+0x22d):move.cpp: undefined reference to `balls'
move.o(.text+0x24e):move.cpp: undefined reference to `move'
move.o(.text+0x25c):move.cpp: undefined reference to `paddles'
move.o(.text+0x265):move.cpp: undefined reference to `balls'
move.o(.text+0x26c):move.cpp: undefined reference to `paddles'
move.o(.text+0x275):move.cpp: undefined reference to `balls'

move.o(.text+0x27c):move.cpp: undefined reference to `paddles'

move.o(.text+0x285):move.cpp: undefined reference to `balls'
move.o(.text+0x2a6):move.cpp: undefined reference to `move'
move.o(.text+0x2b3):move.cpp: undefined reference to `balls'
move.o(.text+0x2bf):move.cpp: undefined reference to `balls'
move.o(.text+0x2d8):move.cpp: undefined reference to `move'
move.o(.text+0x2e4):move.cpp: undefined reference to `move'
move.o(.text+0x2ea):move.cpp: undefined reference to `balls'
move.o(.text+0x2ef):move.cpp: undefined reference to `move'
move.o(.text+0x2f5):move.cpp: undefined reference to `balls'
titlescreen.o(.text+0x4e):titlescreen.cpp: undefined reference to `buffer'
titlescreen.o(.text+0x9d):titlescreen.cpp: undefined reference to `buffer'
titlescreen.o(.text+0xb0):titlescreen.cpp: undefined reference to `gamestate'
titlescreen.o(.text+0x10b):titlescreen.cpp: undefined reference to `buffer'
shutdown.o(.text+0x7):shutdown.cpp: undefined reference to `buffer'

Share this post


Link to post
Share on other sites
Quote:
Original post by Lempface
Yea, that is precisely what I have.. let me post my code.

global.h
*** Source Snippet Removed ***

Draw.h
*** Source Snippet Removed ***

Draw.cpp
*** Source Snippet Removed ***

Main.cpp
*** Source Snippet Removed ***


from the looks of it, you have all your globals externed in global.h, but they arent defined anywhere to begin with. you need a global.cpp or some such implementation file in which you actually declair your globals.

Share this post


Link to post
Share on other sites
They are defined in the functions that call them. For instance

extern struct paddleTag{
...
...
...
} paddles[2];

is defined in init.cpp


void initClass::game() {
//setup paddle0
paddles[0].color = RED;
paddles[0].x = SCREENW / 2;
paddles[0].y = SCREENH - 30;
paddles[0].score = 0;
paddles[0].dir = 0;

//setup paddle1
paddles[1].color = BLUE;
paddles[1].x = SCREENW / 2;
paddles[1].y = 30;
paddles[1].score = 0;
paddles[1].dir = 0;

//setup ball
balls.color = WHITE;
balls.status = 1;
balls.x = SCREENW / 2;
balls.y = SCREENH / 2;
balls.xspeed = 0;
balls.yspeed = 0;

/* This starts the ball moving at the start of the game.
Positive BALLSPEED will send the ball down
where -BALLSPEED will send the ball up */

random = rand() % 2;

if (random == 1)
{
move.y = BALLSPEED;
}
else
{
move.y = -BALLSPEED;
}
}




Full Source

[Edited by - Lempface on June 5, 2006 6:51:29 PM]

Share this post


Link to post
Share on other sites
Quote:
Original post by Lempface
They are defined in the functions that call them. For instance

..snip


that's not defining it, that's using it. You actually need to define it:

globals.h

extern struct paddleTag{
...
...
...
} paddles[2];




globals.cpp

struct paddleTag paddles[2];




-me

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!