Newsgroup: it.comp.programmare.win32
Titolo: VC++... non è ++!!! :-(

Ciao,
sto trafficando da un pò di tempo ormai con C e C++,
se creo una classe con "insert->new class" dal menu
lui mi crea un file nuovo con quella classe e tutto
funziona a meraviglia. Ora però ho provato a scrivere
una classe SENZA farmela fare dal VC++, semplicemente
scrivendo a manina in un file
class pippo
{
private:
....
public:
void pinco(int, int);
......
}
E... mi dà errore!!!
Mi dice "Syntax Error: identifier 'pippo' ".
Ma come?!?!?
Perchè????
Ma... mi devo PER FORZA e SEMPRE affidare al VC per
creare classi nuove? Non può essere... o sì?
E se uno sta portando (come me adesso) dei vecchi
sorgenti dal C al C++ cosa fa? Si spara?

 Perchè????
Se non mi sbaglio dopo l'ultima graffa ci va il punto e virgola.
Kiuhnm

 
No, non ci va... già provato, di quello non gliene cale nè
tanto nè poco.

 Perchè????
Impossibile. Il compilatore ha sempre ragione. Dare dell'incapace ad esso 
si riflette solo contro chi lo ha detto. Sicuramente c'è un errore prima 
di "class pippo". Posta tutto il codice. 
-- 
Luc.

 ha scritto nel messaggio
news:n4Y3a.254717$AA2.9...@news2.tin.it...

ci sarà magari anche un altro errore, ma il punto e virgola ci va per forza
--
Pela


Invece il punto-e-virgola ci va, a mano che tu non voglia definire subito
una o piu' istanze della classe. Probabilmente vi sono anche altri errori.
Federico.

 di "class pippo". Posta tutto il codice. 
Il compilatore avrà pure sempre ragione, ma se ogni tanto ti spiegasse 
pure che ca.zzo vuole non sarebbe male... ho consultato il librone
di Stroustrup, la dichiarazione della classe va bene così. Per quanto
riguarda il resto del codice, te lo posto qui di seguito tutto intero,
è un header file. Magari qualcuno qui lo riconoscerà anche... :-)
Ti tolgo solo un mare di #define di costanti numeriche che vengono usate
altrove e ti metto un commento al punto della dichiarazione della mia
nuova classe (CVARS).
-------------------------------------------------------------
#ifndef _q_shared_
#define _q_shared_
// q_shared.h -- included first by ALL program modules
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
typedef unsigned char 		byte;
typedef enum {false, true}	qboolean;
typedef enum
{
MULTICAST_ALL,
MULTICAST_PHS,
MULTICAST_PVS,
MULTICAST_ALL_R,
MULTICAST_PHS_R,
MULTICAST_PVS_R
} multicast_t;
typedef float vec_t;
typedef vec_t vec3_t[3];
typedef vec_t vec5_t[5];
typedef	int	fixed4_t;
typedef	int	fixed8_t;
typedef	int	fixed16_t;
struct cplane_s;
extern vec3_t vec3_origin;
void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
// just in case you do't want to use the macros
vec_t _DotProduct (vec3_t v1, vec3_t v2);
void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
void _VectorCopy (vec3_t in, vec3_t out);
void ClearBounds (vec3_t mins, vec3_t maxs);
void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs);
int VectorCompare (vec3_t v1, vec3_t v2);
vec_t VectorLength (vec3_t v);
void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
vec_t VectorNormalize (vec3_t v);		// returns vector length
vec_t VectorNormalize2 (vec3_t v, vec3_t out);
void VectorInverse (vec3_t v);
void VectorScale (vec3_t in, vec_t scale, vec3_t out);
int Q_log2(int val);
void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane);
float	anglemod(float a);
float LerpAngle (float a1, float a2, float frac);
#define BOX_ON_PLANE_SIDE(emins, emaxs, p)	\
	(((p)->type < 3)?						\
	(										\
		((p)->dist <= (emins)[(p)->type])?	\
			1								\
		:									\
		(									\
			((p)->dist >= (emaxs)[(p)->type])?\
				2							\
			:								\
				3							\
		)									\
	)										\
	:										\
		BoxOnPlaneSide( (emins), (emaxs), (p)))
void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal );
void PerpendicularVector( vec3_t dst, const vec3_t src );
void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t 
point, float degrees );
//=============================================
char *COM_SkipPath (char *pathname);
void COM_StripExtension (char *in, char *out);
void COM_FileBase (char *in, char *out);
void COM_FilePath (char *in, char *out);
void COM_DefaultExtension (char *path, char *extension);
char *COM_Parse (char **data_p);
// data is an in/out parm, returns a parsed out token
void Com_sprintf (char *dest, int size, char *fmt, ...);
void Com_PageInMemory (byte *buffer, int size);
//=============================================
// portable case insensitive compare
int Q_strcasecmp (char *s1, char *s2);
int Q_strncasecmp (char *s1, char *s2, int n);
//=============================================
short	BigShort(short l);
short	LittleShort(short l);
int		BigLong (int l);
int		LittleLong (int l);
float	BigFloat (float l);
float	LittleFloat (float l);
void	Swap_Init (void);
char	*va(char *format, ...);
//=============================================
char *Info_ValueForKey (char *s, char *key);
void Info_RemoveKey (char *s, char *key);
void Info_SetValueForKey (char *s, char *key, char *value);
qboolean Info_Validate (char *s);
extern	int	curtime;		// time returned by last Sys_Milliseconds
int		Sys_Milliseconds (void);
void	Sys_Mkdir (char *path);
// large block stack allocation routines
void	*Hunk_Begin (int maxsize);
void	*Hunk_Alloc (int size);
void	Hunk_Free (void *buf);
int		Hunk_End (void);
/*
** pass in an attribute mask of things you wish to REJECT
*/
char	*Sys_FindFirst (char *path, unsigned musthave, unsigned canthave );
char	*Sys_FindNext ( unsigned musthave, unsigned canthave );
void	Sys_FindClose (void);
void Sys_Error (char *error, ...);
void Com_Printf (char *msg, ...);
/*
==========================================================
CVARS (console variables)
Ecco ci siamo: io ho trasformato una struct (cvar_t) in una
classe (cvar) di cui poi creo 1 istanza altrove. Ma l'errore
è QUI, perchè non mi accetta la definizione di classe.
Prima di questo punto non mi dà nessun errore. Dopo non
riconosce più niente, nemmeno le definizioni typedef e
struct successive a questa.
Nota: se invece metto due punti ( class cvar: ) dopo cvar,
come se dovesse ereditare da un'altra classe (ma senza
mettere niente da cui ereditare dopo) mi dà errore solo
sulla definizione di questa classe ma il resto del file
viene compilato correttamente... mah
==========================================================
*/
class cvar
{
public:
float VariableValue (char *);
char *VariableString (char *);
char *CompleteVariable (char *);
float GetNum (char *, char *, int);
char *GetStr (char *, char *, int);
void ForceSet (char *, char *);
void Set (char *, char *);
void SetValue (char *, float);
void GetLatchedVars (void);
qboolean Command (void);
qboolean FullSet (char *, char *, int);
qboolean Modified (char *var_name)
qboolean Modified (char *var_name, qboolean mod)
qboolean WriteLatched (FILE *f);
void Set_f (void);
void WriteVariables (char *);
void List_f (void);
void cvar (void);
void ~cvar (void);
};
// plane_t structure
// !!! if this is changed, it must be changed in asm code too !!!
typedef struct cplane_s
{
	vec3_t	normal;
	float	dist;
	byte	type;			// for fast side tests
	byte	signbits;		// signx + (signy<<1) + (signz<<1)
	byte	pad[2];
} cplane_t;
typedef struct cmodel_s
{
	vec3_t		mins, maxs;
	vec3_t		origin;		// for sounds or lights
	int			headnode;
} cmodel_t;
typedef struct csurface_s
{
	char		name[16];
	int			flags;
	int			value;
} csurface_t;
typedef struct mapsurface_s  // used internally due to name len probs //ZOID
{
	csurface_t	c;
	char		rname[32];
} mapsurface_t;
// a trace is returned when a box is swept through the world
typedef struct
{
	qboolean	allsolid;	// if true, plane is not valid
	qboolean	startsolid;	// if true, the initial point was in a solid area
	float		fraction;	// time completed, 1.0 = didn't hit anything
	vec3_t		endpos;		// final position
	cplane_t	plane;		// surface normal at impact
	csurface_t	*surface;	// surface hit
	int			contents;	// contents on other side of surface hit
	struct edict_s	*ent;		// not set by CM_*() functions
} trace_t;
// pmove_state_t is the information necessary for client side movement
// prediction
typedef enum
{
	// can accelerate and turn
	PM_NORMAL,
	PM_SPECTATOR,
	// no acceleration or turning
	PM_DEAD,
	PM_GIB,		// different bounding box
	PM_FREEZE
} pmtype_t;
typedef struct
{
	pmtype_t	pm_type;
	short		origin[3];		// 12.3
	short		velocity[3];	// 12.3
	byte		pm_flags;		// ducked, jump_held, etc
	byte		pm_time;		// each unit = 8 ms
	short		gravity;
	short		delta_angles[3];	// add to command angles to get view direction
									// changed by spawns, rotating objects, and teleporters
} pmove_state_t;
// usercmd_t is sent to the server each client frame
typedef struct usercmd_s
{
	byte	msec;
	byte	buttons;
	short	angles[3];
	short	forwardmove, sidemove, upmove;
	byte	impulse;		// remove?
	byte	lightlevel;		// light level the player is standing on
} usercmd_t;
#define	MAXTOUCH	32
typedef struct
{
	// state (in / out)
	pmove_state_t	s;
	// command (in)
	usercmd_t		cmd;
	qboolean		snapinitial;	// if s has been changed outside pmove
	// results (out)
	int			numtouch;
	struct edict_s	*touchents[MAXTOUCH];
	vec3_t		viewangles;			// clamped
	float		viewheight;
	vec3_t		mins, maxs;			// bounding box size
	struct edict_s	*groundentity;
	int			watertype;
	int			waterlevel;
	// callbacks to test the world
	trace_t		(*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end);
	int			(*pointcontents) (vec3_t point);
} pmove_t;
extern	vec3_t monster_flash_offset [];
typedef enum
{
	TE_GUNSHOT,
	TE_BLOOD,
	TE_BLASTER,
	TE_RAILTRAIL,
	TE_SHOTGUN,
	TE_EXPLOSION1,
	TE_EXPLOSION2,
	TE_ROCKET_EXPLOSION,
	TE_GRENADE_EXPLOSION,
	TE_SPARKS,
	TE_SPLASH,
	TE_BUBBLETRAIL,
	TE_SCREEN_SPARKS,
	TE_SHIELD_SPARKS,
	TE_BULLET_SPARKS,
	TE_LASER_SPARKS,
	TE_PARASITE_ATTACK,
	TE_ROCKET_EXPLOSION_WATER,
	TE_GRENADE_EXPLOSION_WATER,
	TE_MEDIC_CABLE_ATTACK,
	TE_BFG_EXPLOSION,
	TE_BFG_BIGEXPLOSION,
	TE_BOSSTPORT,			// used as '22' in a map, so DON'T RENUMBER!!!
	TE_BFG_LASER,
	TE_GRAPPLE_CABLE,
	TE_WELDING_SPARKS,
	TE_GREENBLOOD,
	TE_BLUEHYPERBLASTER,
	TE_PLASMA_EXPLOSION,
	TE_TUNNEL_SPARKS,
//ROGUE
	TE_BLASTER2,
	TE_RAILTRAIL2,
	TE_FLAME,
	TE_LIGHTNING,
	TE_DEBUGTRAIL,
	TE_PLAIN_EXPLOSION,
	TE_FLASHLIGHT,
	TE_FORCEWALL,
	TE_HEATBEAM,
	TE_MONSTER_HEATBEAM,
	TE_STEAM,
	TE_BUBBLETRAIL2,
	TE_MOREBLOOD,
	TE_HEATBEAM_SPARKS,
	TE_HEATBEAM_STEAM,
	TE_CHAINFIST_SMOKE,
	TE_ELECTRIC_SPARKS,
	TE_TRACKER_EXPLOSION,
	TE_TELEPORT_EFFECT,
	TE_DBALL_GOAL,
	TE_WIDOWBEAMOUT,
	TE_NUKEBLAST,
	TE_WIDOWSPLASH,
	TE_EXPLOSION1_BIG,
	TE_EXPLOSION1_NP,
	TE_FLECHETTE
//ROGUE
} temp_event_t;
#define	ANGLE2SHORT(x)	((int)((x)*65536/360) & 65535)
#define	SHORT2ANGLE(x)	((x)*(360.0/65536))
typedef enum
{
	EV_NONE,
	EV_ITEM_RESPAWN,
	EV_FOOTSTEP,
	EV_FALLSHORT,
	EV_FALL,
	EV_FALLFAR,
	EV_PLAYER_TELEPORT,
	EV_OTHER_TELEPORT
} entity_event_t;
typedef struct entity_state_s
{
	int		number;			// edict index
	vec3_t	origin;
	vec3_t	angles;
	vec3_t	old_origin;		// for lerping
	int		modelindex;
	int		modelindex2, modelindex3, modelindex4;	// weapons, CTF flags, etc
	int		frame;
	int		skinnum;
	unsigned int		effects;		// PGM - we're filling it, so it needs to be 
unsigned
	int		renderfx;
	int		solid;			// for client side prediction, 8*(bits 0-4) is x/y radius
							// 8*(bits 5-9) is z down distance, 8(bits10-15) is z up
							// gi.linkentity sets this properly
	int		sound;			// for looping sounds, to guarantee shutoff
	int		event;			// impulse events -- muzzle flashes, footsteps, etc
							// events only go out for a single frame, they
							// are automatically cleared each frame
} entity_state_t;
//==============================================
typedef struct
{
	pmove_state_t	pmove;		// for prediction
	// these fields do not need to be communicated bit-precise
	vec3_t		viewangles;		// for fixed views
	vec3_t		viewoffset;		// add to pmovestate->origin
	vec3_t		kick_angles;	// add to view direction to get render angles
								// set by weapon kicks, pain effects, etc
	vec3_t		gunangles;
	vec3_t		gunoffset;
	int			gunindex;
	int			gunframe;
	float		blend[4];		// rgba full screen effect
	float		fov;			// horizontal field of view
	int			rdflags;		// refdef flags
	short		stats[MAX_STATS];		// fast status bar updates
} player_state_t;
// ==================
// PGM
#define VIDREF_GL		1
#define VIDREF_D3D		2
#define VIDREF_OTHER	3
extern int vidref_val;
// PGM
// ==================
#endif


1) Devi usare un file .cpp e non .c per poter usare le classi.
2) costruttori e distruttori non devono avere un valore di ritorno (neanche
void).

 void).
1) No, pure se salvo come .cpp e lo riapro mi dà gli stessi errori.
2) Sì, ma il problema comincia PRIMA... quelli non li vede nemmeno
(e infatti fra gli errori che mi dà non ce n'è nessuno che riguarda i 
costruttori/distruttori...)

> void).
rettifico, ho riaperto il file in un altro workspace creato apposta
e adesso gli errori non sono più quelli... la classe la riconosce,
in compenso mi dà 26 errori invece di 8 ... :-)

 ha scritto nel messaggio
news:rf64a.193097$0v.53...@news1.tin.it...

Io ho effettuato le seguenti operazioni:
1) ho creato un nuovo progetto vuoto di tipo "Win32 Console Application" (o
anche "Win 32 Application")
2) ho creato un file "q_shared.cpp"
3) ho incollato il codice completo che hai postato tu
4) ho compilato il file.
Il compilatore mi ha dato il seguente output:
--------------------Configuration: Test2 - Win32 Debug--------------------
Compiling...
q_shared.cpp
d:\documenti\training\c++\test\test2\q_shared.cpp(16) : error C2059: syntax
error : 'constant'
d:\documenti\training\c++\test\test2\q_shared.cpp(16) : error C2143: syntax
error : missing ';' before '}'
d:\documenti\training\c++\test\test2\q_shared.cpp(16) : error C2143: syntax
error : missing ';' before '}'
d:\documenti\training\c++\test\test2\q_shared.cpp(128) : error C2146: syntax
error : missing ';' before identifier 'Info_Validate'
d:\documenti\training\c++\test\test2\q_shared.cpp(128) : error C2501:
'qboolean' : missing storage-class or type specifiers
d:\documenti\training\c++\test\test2\q_shared.cpp(128) : fatal error C1004:
unexpected end of file found
Error executing cl.exe.
q_shared.obj - 6 error(s), 0 warning(s)
5) ho cambiato la riga
typedef enum {false, true} qboolean;
in
typedef bool qboolean;
6) ho aggiunto i ; dove mancavano
7) ho corretto il costruttore ed il distruttore
8) ho definito MAX_STATS
9) ho ricompilato il file:
FUNZIONA!

 FUNZIONA!
Sě, č quello che ho dovuto fare anch'io :-)
Adesso ho rinominato anche gli ALTRI files da .c a .cpp
e mi ritrovo a dover castare tutto esplicitamente :-)
Comunque č un lavoro molto istruttivo, senz'altro...