[c++ POO] multiple definition of 'vid'

Fermé
djgiz - Modifié par djgiz le 21/07/2011 à 18:56
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 9 août 2011 à 11:54
Bonjour,

J'utilise Qt c++ pour faire un projet.
J'aimerais savoir si avec Qt on peut déclarer un objet "tout seul" c'est à dire en dehors de la classe du widget principal ?

Comme ceci dans le MainWindow.h:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0);     
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui;    
}; 
Phonon::VideoWidget vid; 


N-B : ici je place la déclaration de vid juste avant le #endif

Quand je fais ceci le compilateur bloque et indique " multiple definition of 'vid' ".
Je ne vois pas comment il peut déjà être défini alors qu'il est construit en-dehors de la classe.
Ma question ici : est-ce que déclarer un objet "isolé", c.à.d non-membre d'une classe est permis ?

9 réponses

C'est crade.
Quelle est la raison pour que tu veuille le mettre là ton objet ?
0
Salut,
Je n'ai pas de raison spéciale : j'aurais juste aimé savoir si c'est possible.
Après dans des membres de MainWindow je l'utilise :
vw.setwindowflags();

C'est peut-être pour ça que ça bloque ?

Peux-tu me dire pourquoi c'est crade ?
J'aimerais savoir car c'est marqué dans aucun tuto... Merci d'avance bonne journée à toi.
Cordialement, Gizmo.
0
Déjà c'est vraiment inutile d'essayer de te servir de vw à l'intérieur de ta classe, alors que tu le déclare en dehors...

Ca pose un problème de sécurité, me semble-t-il, car si t'ajoute d'autres sources, ils peuvent ce servir de cette variable.

Là ton objet est un widget en plus, essayer de s'en servir comme tu le fait signifie que t'as pas vraiment capté la poo.
0
non non au contraire je pense (du moins j'espère avoir compris)
juste seulement savoir si le fait que mon compilateur bloque vient de ceci : j'ai déclaré le vid en dehors de la MainWindow ? Est-ce possible d'y accéder depuis un membre de ma classe MainWindow ? Si oui comment ?
Je sais parfaitement que c'est une aberration mais est-ce possible quand même dans l'absolu ?
En te remerciant. Cordialement, DJGiz.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut,

C'est bien ce qui me semblait c'est pas possible d'accéder à une variable complètement isolée non-membre d'une classe ?...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 août 2011 à 11:50
si, pas de souci particulier.
0
Bonjour,

Je posais juste la question comme ça je vais un lecteur vidéo.
J'aurais aimé savoir au sujet des fonctions virtual protected : la seule manière de les utiliser est de sous-classer et de les redéfinir à l'intérieur ?

Merci d'avance pour la réponse.
Cordialement, Gizmo.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 août 2011 à 11:54
oui et non. Il n'y a pas forcément besoin de redéfinir un membre virtuel (sauf s'il est abstrait), un membre virtual laisse la possibilité de le surcharger. Mais en effet la seule façon de l'utiliser c'est de "sous-classer" s'il est protégé.
0
C'est un peu le principe d'une méthode virtuelle...
0
Bonjour,
Merci pour la réponse au sujet du virtual.
En ce qui concerne mon vw à déclarer en "isolé" en dehors de ma classe MainWindow : je sais que ça ne se fait pas : j'aurais aimé savoir pourquoi il me met : error : multiple definition of 'vid' ?

Je vous souhaite une bonne journée à toutes et à tous.
Cordialement, djgiz.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 août 2011 à 11:46
Bon, ça s'enlise. J'apporte la bonne réponse.
La ligne
Phonon::VideoWidget vid;
n'est pas une déclaration mais une définition et il ne peut y avoir qu'une seule définition pour l'ensemble du programme. Or tu mets ta définition dans un .h qui (d'après l'erreur) est inclus dans plusieurs fichiers source, d'où conflit.
dans ton .h remplace la ligne par :
extern Phonon::VideoWidget vid;
et met la définition dans un fichier source (.cpp).
Quant à la propreté, vu le peu que tu donnes, je n'ai pas d'avis.
0