QObject :: QObject (QObject parent = 0) является закрытым в этом контексте - PullRequest
2 голосов
/ 11 февраля 2012

У меня есть класс с именем mesh. Я хочу отслеживать его объекты. Так что когда нибудь новый Сетка создана, я хотел получить сигнал. И так я добавил

class mesh: public QObject

и сделал все методы как слоты и добавил сигнал в c-tor meshCreated. Но из вот мои годы боли начались. Несмотря ни на что, ошибка в названии началась появляться. Даже думал, что я прокомментировал все строки, т.е. добавил // перед каждой строкой в коде это все еще говорит то же самое. Как я могу это исправить?

Фактический код

#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 Ответ

2 голосов
/ 11 февраля 2012

Строка, которая генерирует эту ошибку, такова:

mesh operator=(mesh input);

Классы, производные от QObject, не могут иметь конструкторы копирования.В документации QObject говорится:

Нет конструктора копирования или оператора присваивания. QObject не имеет ни конструктора копирования, ни оператора присваивания.Это по замыслу.На самом деле они объявлены, но в закрытом разделе с макросом Q_DISABLE_COPY ().Фактически, все классы Qt, производные от QObject (прямые или косвенные), используют этот макрос, чтобы объявить их конструктор копирования и оператор присваивания закрытыми.Обоснование можно найти в обсуждении Identity vs Value на странице Qt Object Model.Основным следствием этого является то, что вы должны использовать указатели на QObject (или на ваш подкласс QObject), где в противном случае у вас может возникнуть искушение использовать ваш подкласс QObject в качестве значения.Например, без конструктора копирования вы не можете использовать подкласс QObject в качестве значения, которое будет храниться в одном из классов контейнера.Вы должны хранить указатели.

Если вы хотите отслеживать созданные mesh объекты, вы можете использовать, например, QList<mesh*> из одного из ваших других классов.Как только объект создан, вы помещаете его в список и т. Д.

...