2012-02-11 2 views
2

J'ai une classe appelée mesh. Je veux garder une trace de ses objets. Donc, quand jamais un nouveau maillage est créé, je voulais avoir un signal. Et donc j'ai ajoutéQObject :: QObject (QObject parent = 0) est privé dans ce contexte

class mesh: public QObject 

et fait tous les procédés comme des fentes et ajouté un signal au maillage de torreur. Mais de ici sur mes années de douleur ont commencé. Peu importe quoi, l'erreur dans le titre a commencé à apparaître. Même pensé que j'ai commenté toutes les lignes, c'est-à-dire, ajouté // avant chaque ligne dans le code, il dit toujours la même chose. Comment puis-je réparer cela?

Le code réel

#ifndef mesh_H 
#define mesh_H 

#include <QObject> 
#include "mvert.h" 
#include "medge.h" 
#include "mface.h" 

#include <QList> 
#include <QString> 
#include <QDebug> 
#include "glmaterial.h" 

class mesh : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit mesh(QObject *parent = 0); 
    QString getName(); 

private: 
    QString Name; 
    GLMaterial material; 

    QList<MVert> VertList; 
    QList<MEdge> EdgeList; 
    QList<MFace> FaceList; 

    MVert Centroid; 

    QList<int> QFaces; 
    QList<int> TFaces; 

public slots: 
    void setName(QString Name); 
    void ReadmeshData(QString meshsrc); 
    void displayVerts(); 
    void displayEdges(); 
    void displayFaces(); 
    void addVert(MVert vert); 
    void addEdge(MEdge edge); 
    void addFace(MFace face); 
    void removeDoubles(); 
    MVert generateCentroid(); 
    //FIXUS 
    void sortQandT(); 
    void reorderFaces(); 
    void subDivFace(int index, int res); 
    void forcedTriangulate(); 
    //FIXUS 
    bool isVertInEdge(MVert input, MEdge edg); 
    bool similarVerts(int i,int j); 

    QList<int> relatedFacesToVert(MVert input); 
    QList<int> relatedEdgesToVert(MVert input); 
    QList<int> relatedVertsToVert(MVert input); 
    QList<int> relatedFacesToEdge(MEdge input); 
    QList<int> relatedEdgesToEdge(MEdge input); 
    QList<int> relatedEdgesToFace(MFace input); 
    QList<int> relatedFacesToFace(MFace input); 

    QList<MVert> reducedVList(); 

    QList<MVert> vlistInstance(); 

    MVert midPointOfEdge(int i); 
    MVert centroidOfFace(int i); 

    mesh operator=(mesh input); 

    void GLdraw(); 

signals: 
    void meshCreated(mesh *mesh); 

}; 
+1

Veuillez écrire le code où l'erreur est déclenchée. – Mat

Répondre

2

La ligne qui génère cette erreur est celle-ci:

mesh operator=(mesh input); 

classes qui dérivent de QObject ne sont pas autorisés à avoir des constructeurs de copie. Comme l'indique la documentation QObject:

Aucun constructeur de copie ou opérateur d'affectation QObject n'a ni un constructeur de copie, ni un opérateur d'affectation. C'est par conception. En fait, ils sont déclarés, mais dans une section privée avec la macro Q_DISABLE_COPY(). En fait, toutes les classes Qt dérivées de QObject (direct ou indirect) utilisent cette macro pour déclarer leur constructeur de copie et leur opérateur d'affectation comme privés. Le raisonnement se trouve dans la discussion sur Identité vs Valeur sur la page Modèle d'objet Qt. La conséquence principale est que vous devez utiliser des pointeurs vers QObject (ou vers votre sous-classe QObject) où vous pourriez être tenté d'utiliser votre sous-classe QObject comme valeur. Par exemple, sans un constructeur de copie, vous ne pouvez pas utiliser une sous-classe de QObject comme valeur à stocker dans l'une des classes de conteneur. Vous devez stocker des pointeurs.

Si vous voulez garder une trace de mesh objets créés, vous pouvez par exemple utiliser QList<mesh*> d'un de vos autres classes. Une fois l'objet créé, vous le poussez dans la liste, etc.

+0

J'ai aussi essayé Q_DISABLE_COPY(). Mais ça ne marchait pas bien.Donno pourquoi. Mais j'ai deviné, si tout échoue, laisse aller avec des pointeurs et a commencé à recoder l'ensemble du projet en termes de pointeurs. On dirait que mon intuition était correcte. Maintenant, ça a commencé à fonctionner. Merci beaucoup pour votre réponse. Je vais le marquer dans mon cerveau. Donc, en une phrase à dire. "SI VOUS UTILISEZ QT ==> VOUS DEVEZ UTILISER DES POINTEURS" –

+0

Je suis heureux d'avoir pu vous aider – Neox

Questions connexes