Newsgroup: it.comp.lang.c++
Titolo: inclusione ricorsicva

Salve a tutti
Sto realizzando un sw nel quale ho una pipeline the thread che lavorano 
su un bus
#ifndef CVIDEOBUS_H
#define CVIDEOBUS_H
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "cvideoworker.h"
class cvideobus
{
public:
  cvideobus(int width, int height);
  ~cvideobus();
  // è questa linea che da problemi why?
   int RegisterWorker (cvideoworker * Worker);
}
-------------------------------------------------------------------------------------
#ifndef CVIDEOWORKER_H
#define CVIDEOWORKER_H
#include "cvideobus.h"
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
class cvideoworker
{
public:
  cvideoworker();
  ~cvideoworker();
   /** No descriptions */
  void stopWork();
   /** No descriptions */
  void startWork();
   /** connect to the video bus */
  void connect2videobus(cvideobus * vb);
   /** execute the work */
  virtual void *executeWork();
   /** initialise the class */
  virtual int init() = 0;
   /** set the workerID */
   void setWorkerID (int iWorkID);
}
-------------------------------------------------------------------------------------
#ifndef CVIDEODATE_H
#define CVIDEODATE_H
#include <cvideoworker.h>
#include <string>
class cvideodate:public cvideoworker {
public:
  cvideodate();
  ~cvideodate();
   /** initialise the class, this method should be called after the 
connection to the video bus */
  int init();
   /** set the format of the image , ie ppm, jpg etc  */
  void setImageFormat(string sImgExtension);
   /** No descriptions */
   void * executeWork();
}
premesso che i vari ifdef mi sembrano correti come mai il gcc mi segnala 
un errore
cvideobus.h:47: `cvideoworker' was not declared in this scope
cvideobus.h:47: `Worker' was not declared in this scope
cvideobus.h:47: invalid data member initialization
Dove sbaglio? mi sa tanto uno di quegli errori stupidi di ricorsione 
degli include solo che ci sto diventando di gomma :(
grazie mille a tutti

 #include "cvideoworker.h"
Al posto di questo include, metti un semplice "class cvideoworker;". 
Cosi' spezzi la ricorsione, che altrimenti porta sempre uno dei due 
simboli ad essere non definito nell'altro header.
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 
sono un po stanco, ma se al posto di
#include "cvideoworker.h"
metto
#include class cvideoworker;
oppure
#include <class cvideoworker>
#include "class cvideoworker"
mi da un sacco di errori, e sullo Schildt non l'ho mai studiata, ho 
franteso qualcosa?
grazie mille

 sono un po stanco
Si vede ;)
Devi mettere semplicemente
class cvideoworker;
In quel caso la compilazione non ti da errori.
Buon lavoro,
j0k3r

j0k3r wrote:
[ cut ]
Dimenticavo, si chiama 'forward declaration', ed ha infatti il compito 
di anticipare la dichiarazione della classe. E' come se dicessi al 
compilatore "Te non preoccuparti, questa classe c'è, quando il linker la 
cercherà la trovera....".
Ciao,
j0k3r


ah siiiiii caxxo, che errore da sbarbatello di primo anno di università 
sigh:( vabbe grazie mille


ok giusto, ma allora perche se uso
  int cvideobus::RegisterWorker (cvideoworker * Worker){
   iTotalWorker++;
   Worker->setWorkerID(iTotalWorker);
}
cvideobus.cpp:101: invalid use of undefined type `struct cvideoworker'
cvideobus.h:17: forward declaration of `struct cvideoworker'
Ovvero ho un bus, un worker si connette al bus, e nella procedure di 
conessione, il bus assegna al worker il suo identificatiovo univoco di 
worker, in modo che a sua volta il worker quando accede ad un elemento 
del bus /pipeline, sappia se quel elemento è già stato processato da 
altri worker.
Grazie mille ancora
Vado a nanna sono le 4 del mattino

...

Per essere proprio pignoli, si chiama dichiarazione punto e basta. Le
dichiarazioni forward sono un concetto specifico del Pascal.
Ciao,
Nicola


Grazie, meglio essere pignoli ;)
Ma curiosità, mi sono sbagliato io o effettivamente da qualche parte la 
chiamano così ?
...azzie !

 ...azzie !
Per l'appunto in ISO Pascal, dove non esistendo meccanismi per la
compilazione separata le dichiarazioni (per l'appunto "forward")
servono esclusivamente a risolvere le dipendenze cicliche.
Ciao,
Nicola

 servono esclusivamente a risolvere le dipendenze cicliche.
Beh, se non sbaglio ormai la "forward declaration" e' un concetto 
entrato a far parte del lessico informatico in generale, per piu' 
linguaggi... almeno, io l'ho sempre sentito applicato in generale :)


 cvideobus.h:17: forward declaration of `struct cvideoworker'
Giustamente: se vuoi chiamare un metodo, il compilatore dovra' per forza 
sapere com'e' fatta quella classe!
D'altronde, se fai le cose per bene, questo metodo che scrivi dovra' 
andare in videobus.cc (o come si chiami), dove invece potrai anche 
includere tranquillamente "videoworker.h", e dove quindi sara' presente 
la dichiarazione completa.


 linguaggi... almeno, io l'ho sempre sentito applicato in generale :)
Ma non sempre concetti simili hanno la stessa valenza in linguaggi
diversi. Per esempio la distinzione tra dichiarazione e definizione di
classe e' un concetto proprio del C++, anche se molti linguaggi
prevedono dichiarazioni e/o definizioni (ed alcuni chiamano
dichiarazioni quelle che in C++ sono definizioni).
Ciao,
Nicola
"Non si puo' essere un po' rigorosi"

 
si in teoria si, ma scusa la class videoworker ha il metodo setworkerid.
io nel videobus., metto il class videoworker; quindi gli dico, guarda 
che videowoerk te lo dichiaro + avanti. videoworker deve chiamare 
videobus, quindi li ha #include "videobus.h". quindi in teoria tutto ok, 
ma all'atto pratico mi da gli errori sopraindicati.... e non capisco il 
perchč :(

 perchè :(
vuoi direi che c'e' un #include "videobus.h" in videoworker.cc, ma cmq 
ti da errore li'?
Cmq, quando hai questi problemi, comincia sempre a ragionare come fa il 
preprocessore, per vedere se tutto e' al posto giusto ;)


 
io ragiono come fa il preprocessore, ma si vede che ragiono male