You are not logged in.

  • Login

1

Sunday, December 25th 2011, 4:53pm

Initalisierung eines boolean Arrays in der Klasse funktioniert nicht

Moinmoin,
ich habe mich jetzt endlich an OOP in C++ in verbindung mit SDL rangetraut. Mein Problem ist, dass ich gerne einen boolischen (heißt das so ?( ) im private-Bereich initalisieren würde. Doch wenn ich das versuche bekomm ich folgende Fehlermeldung:

...\SGSF\include\GameFunctions.h|14|error: a brace-enclosed initializer is not allowed here before '{' token|
...\SGSF\include\GameFunctions.h|14|error: ISO C++ forbids initialization of member 'keys'|
...\SGSF\include\GameFunctions.h|14|error: making 'keys' static|
...\SGSF\include\GameFunctions.h|14|error: invalid in-class initialization of static data member of non-integral type 'bool [323]'|
...\SGSF\include\GameFunctions.h||In member function 'void game::handleInput()':|
...\SGSF\include\GameFunctions.h|79|error: 'keys' was not declared in this scope|
...\SGSF\include\GameFunctions.h|84|error: 'keys' was not declared in this scope|
...\SGSF\include\GameFunctions.h|88|error: 'keys' was not declared in this scope|
...\SGSF\main.cpp||In function 'int SDL_main(int, char**)':|
...\SGSF\main.cpp|13|warning: no return statement in function returning non-void|
||=== Build finished: 7 errors, 1 warnings ===|


Code:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>
#include <iostream>
#include <cstdlib>
 
 
#include "integer.h"
 
using namespace std;
 
class game
{
private:
	bool gameRunning;
	bool keys[323] = {false};
	SDL_Event event;
 
public:
	game();
	void start();
	bool isRunning();
	void drawSprite(int sWidth, int sHeight, int xPos, int yPos, SDL_Surface* source, SDL_Surface* destination);
	void handleInput();
	void close();
};


Wenn ich den Array in der handle::input(); initalisiere läuft alles ohne Probleme. Wäre dankbar für Hilfe ^^

2

Sunday, December 25th 2011, 6:15pm

hi,

es ist ratsam das array in der cpp file zu initialisieren. Ich glaube auch man kann die nicht im header initialisieren,
Versuche es mal entweder direkt im Konstruktor oder in einer extra Methode zu initialisieren.

Ach ja um auf private attribute zu zugreifen brauchst du noch für jedes attribut eine get/set-methode

C/C++ Quellcode

1
2
3
4
5
6
7
// header
private: bool keys[323];public: bool get_keys();public: void set_keys(bool key);
//--------------------------------//
//cpp
bool get_keys(){return keys;}
 
void set_keys(bool key){ keys = key;}



grüße
nobody

edit: kann mich mal jemand aufklären wieso der teil zwischen dem codetags so komisch formatiert und wie ich das behebe?^^

This post has been edited 1 times, last edit by "nobody special" (Dec 26th 2011, 3:49pm)


3

Sunday, December 25th 2011, 6:34pm

Danke,
aber ich brauche den Array nur in meiner Klasse ;) Gibts da keine Möglichkeit?

4

Sunday, December 25th 2011, 6:53pm

Das Array befinden sich doch nur in deiner Klasse :)

Du kannst dir die Header Datei als eine Art Bauplan für ein Objekt vorstellen
Die das zugehörige CPP File definiert den Inhalt der Methoden

Um in deinem Programm dann dein Array nutzen zu können benötigst du eine Instanz davon.
Objektorientierte Programmierung bieten den Vorteil das wir mit Objekten arbeiten können.
Das heiß wir erstellen ein Objekt mit Eigenschaften(Attribute) und Fähigkeiten(Methoden)
diese besteht aus Header und CPP.
Nun können wir so viele Instanzen wie wir brauchen von dem Objekt erstellen. Jede Instanz beinhalten dann die Attribute und Methoden und sind trotzdem von ihrem werten unterschiedlich


Eine Instanz erzeugst du mit dem Befehl new.
Es ist aber darauf zu achten das man diese Instanz von einem Objekt, wenn man sie nicht mehr benötigt mir delete wieder löscht.
Da der Befehl new für dein Objekt, vom Heap speicher anfordert und ihn erst wieder mit delete freigibt.

5

Sunday, December 25th 2011, 6:53pm

Das Array befinden sich doch nur in deiner Klasse :)

Du kannst dir die Header Datei als eine Art Bauplan für ein Objekt vorstellen
Die das zugehörige CPP File definiert den Inhalt der Methoden

Um in deinem Programm dann dein Array nutzen zu können benötigst du eine Instanz davon.
Objektorientierte Programmierung bieten den Vorteil das wir mit Objekten arbeiten können.
Das heiß wir erstellen ein Objekt mit Eigenschaften(Attribute) und Fähigkeiten(Methoden)
diese besteht aus Header und CPP.
Nun können wir so viele Instanzen wie wir brauchen von dem Objekt erstellen. Jede Instanz beinhalten dann die Attribute und Methoden und sind trotzdem von ihrem werten unterschiedlich


Eine Instanz erzeugst du mit dem Befehl new.
Es ist aber darauf zu achten das man diese Instanz von einem Objekt, wenn man sie nicht mehr benötigt mir delete wieder löscht.
Da der Befehl new für dein Objekt, vom Heap speicher anfordert und ihn erst wieder mit delete freigibt.

Edit: oh, hat er glatt zweimal gepostet, naja doppelt hält besser :)

6

Sunday, December 25th 2011, 8:37pm

Hi Jaffa Coder,

folgendes

Source code

1
bool keys[323] = {false};

kannst du so nicht machen; das ist ein Syntaxfehler.

Was willst du damit ausdrücken ? Dass das ganze Array mit false initialisiert wird ?
Wie kommst du denn darauf das so hinzuschreiben ? Gibt es eine Sprache die diese Nuance bietet ?

Typischerweise nutzt man den Konstruktor dazu, solche Dinge zu erledigen.

BTW: was meint ihr mit SDL, was ist das ?
BTW': wie kann ich dem Syntaxhighlight eine Sprache sagen ?

7

Sunday, December 25th 2011, 8:59pm

SDL = Simple DirectMedia Layer
Klick mal unten auf 'Syntax'. Dann siehst du die ganzen Sprachen. Klicke auf C&C++ und fertig.
Für die Initialisierung von eines solchen boolean-Arrays würde ich das Ganze so machen, wahrscheinlich geht´s leichter und vor Allem schneller:

C/C++ Quellcode

1
2
3
bool Keys[323];
for(int i=0; i<323; ++i)
    keys[i] = false;

Doch merk dir: Keine Initialisierungen in dem Klassenkopf! Nur im Körper, sozusagen. Einfach nicht zwischen der Deklaration der Klasse, ich hoffe du weißt was gemeint ist....


MfG
Check

This post has been edited 1 times, last edit by "Checkmateing" (Dec 25th 2011, 9:27pm)


8

Sunday, December 25th 2011, 9:03pm

Grundsätzlich kann man keine Variablen direkt in der Headerstruktur mit einem Wert festlegen. Da du eine Klasse hast und man bei Klassen davon ausgeht das diese sich von anderen zumindest Teilweße unterscheiden muss die einzelnen Variablen initializerung der Klasse im Konstruktor erfolgen, es könnte ja sein das sich die Klasse unterschiedlich verhaltet....

zb. mit memset(keys, sizeof(keys), 0)
oder ner eigenen Schleife

@Runnable:
SDL -> Grafik-Engine

@nobody special:
Im Beitragseditor unterhalb des Editorfensters Syntax auswählen ;)

Mfg Rushh0ur

9

Sunday, December 25th 2011, 9:12pm

Falsch! Die SDL ist nicht nur eine Grafikengine. ;)
Was sie kann steht hier, auch wenn ich diese Seite nicht mag. <.<
Und freilich steht dort mitunter

Quoted

Audioausgabe
In 8 und 16 bit, mono/stereo
, was mehr als Grafikausgabe ist.
Statt SDL würde ich eher SFML benutzen. Warum? Darum!

MfG
Check

This post has been edited 1 times, last edit by "Checkmateing" (Dec 25th 2011, 9:26pm)


Similar threads

Social bookmarks