Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [C++] header ongelma

Touho [01.01.2010 19:44:47]

#

tuner.h:

#ifndef TUNER_H_INCLUDED
#define TUNER_H_INCLUDED

const char *texturePath[] =
{
    "texture.png"
};

#endif

main.cpp:

#include "tuner.h"
#include "game.h"

game.cpp:

#include "tuner.h"

Buildausvaiheessa kääntäjä valittaa, että texturePath on määritelty useassa paikassa.

Miten minun pitäisi määritellä tämän tyyppisesti globaaleja vakioita?

os [01.01.2010 20:01:48]

#

Esim näin:

h.h:

// ...
extern const char *tekstit[];
// ...

tekstit.c:

#include "h.h" // ei pakollinen
const char *tekstit[] = { "foo", "bar", "baz" };

muu.c:

#include "h.h"
// ...
puts(tekstit[1]);
// ...

Metabolix [01.01.2010 21:17:14]

#

Katsopa vinkit 1770 ja 1901.

Touho [02.01.2010 13:49:08]

#

Kiitos paljon!

On vain ikävää, että joutuu jakamaan nuo määrittelyt kahteen eri tiedostoon.

Esim:

#define OBJECT_CAR 0
#define OBJECT_TREE 1
#define OBJECT_ROCK 2

extern const char *texturePath[];
extern char *modelPath[];
const char *texturePath[] =
{
    "car.png",
    "tree.png",
    "rock.png",
};

char *modelPath[] =
{
    "car.model",
    "tree.model",
    "rock.model",
};

Onko tämä mahdollista toteuttaa järkevämmin jakamatta urleja ja OBJECT_ määrittelyjä eri tiedostoihin?

Claw [02.01.2010 20:57:26]

#

Voit korvata #define-rivit käyttämällä enum:ia. Kas näin:

#include <iostream>

enum TileType { EMPTY=0, GRASS, SNOW, SAND, ROCK};

int main() {

    short n=SNOW;

    std::cout << "Tile type: ";

    switch(n) {
        case EMPTY:
            std::cout << "empty";
            break;
        case GRASS:
            std::cout << "grass";
            break;
        case SNOW:
            std::cout << "snow";
            break;
        case SAND:
            std::cout << "sand";
            break;
        case ROCK:
            std::cout << "rock";
            break;
        default:
            std::cout << "unknown type!";
            break;
    }

    std::cout << "." << std::endl;
    return 0;

}

Google antaa hyvin ohjeita esim. tuon enumin käytöstä. Kannattaa sisälyttää tuo enum otsaketiedostoon josta sen saa aina tarjottua helposti kaikille sitä tarvitseville kooditiedostoille.

Touho [03.01.2010 13:07:58]

#

Se ei poista ongelmaa. Haluisin, että objektit määriteltäisiin samassa tiedostossa kuin polut, koska silloin niitä on helpompaa hallita.

Ymmärsin, että polkujen määrittely on järkevintä tehdä .cpp tiedostossa extern vakioilla. Jos laittaisin enumin .cpp tiedostoon, en pääsisi siihen globaalisti käsiksi projektissa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta