2009-11-22 1 views
8

Ce qui suit des erreurs de compilation est ce que j'ai:Erreur avec la sous-classe `QObject` et constructeur de copie:` QObject :: QObject (const & QObject) est private`

/usr/lib/qt-3.3/include/qobject.h: In copy constructor Product::Product(const Product&): 
/usr/lib/qt-3.3/include/qobject.h:211: error: QObject::QObject(const QObject&) is private 
Product.h:20: error: within this context 
HandleTCPClient.cpp: In member function int Handler::HandleTCPClient(int, std::string, std::string): 
HandleTCPClient.cpp:574: note: synthesized method Product::Product(const Product&) first required here 
HandleTCPClient.cpp:574: error: initializing argument 1 of std::string productDetails(Product) 
/usr/lib/qt-3.3/include/qobject.h: In member function Product& Product::operator=(const Product&): 
Product.h:20: instantiated from void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Product, _Alloc = std::allocator<Product>] 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:610: instantiated from âvoid std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Product, _Alloc = std::allocator<Product>]â 
HandleTCPClient.cpp:173: instantiated from here 
/usr/lib/qt-3.3/include/qobject.h:212: error: QObject& QObject::operator=(const QObject&) is private 
Product.h:20: error: within this context 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc: In member function void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Product, _Alloc = std::allocator<Product>]: 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:260: note: synthesized method âProduct& Product::operator=(const Product&) first required here 
make: *** [HandleTCPClient.o] Error 1 

Une partie de mon HandleTCPClient.cpp Ligne 574:

  Product tempProduct;// temporary Product storage variable 
      tempProduct.setHandler(this); 
... 

      else if (output[1] == '5') // description 
      { 
       output.erase(0,2); // erase the sequence numbers 
       tempProduct.description = output; 
    LINE 574   output = productDetails(tempProduct); // obtain client given information about selling product 
      } 

Product.h ::

#include <string> 
#include <qtimer.h> 
#include "HandleTCPClient.h" 
#ifndef PRODUCT_H 
#define PRODUCT_H 
#include <qobject.h> 
#include <qgl.h> 

class Handler; 

//Define ourselves a product class 
class Product : public QObject 
    { 

     Q_OBJECT 

     void startTimer(); 

    public: 
     Product(); 

     string seller, itemName, description, highestBidder; 
     double price, min, buyingPrice, currentBid; 
     int time; 
     bool isSold; 
     Handler *handler; 

     void setHandler(Handler *h); 

    public slots: 
     void setProductToSold(); 

    }; 

#endif 

Product.cpp ::

#include <string> 
using std::string; 

#include "Product.h" 

Product::Product() 
{ 
    seller = ""; 
    itemName = ""; 
    price = 0.00; 
    min = 0.00; 
    buyingPrice = 0.00; 
    time = 0; 
    description = ""; 
    highestBidder = "None"; 
    currentBid = 0.00; 
} 

void Product::setHandler(Handler *h) 
{ 
    handler = h; 
} 

Merci pour toute l'aide =)

Répondre

21

Product est une sous-classe de QObject, qui ne peut pas être copiée. Votre code tente de le copier quelque part (peut-être dans productDetails(tempProduct)) et cela provoque l'erreur. Peut-être que vous pourriez le passer à votre fonction par référence const plutôt; ou peut-être qu'une refonte de votre programme est nécessaire.

Votre compilateur vous dit que le constructeur de copie de QObject est privé, donc il ne peut pas être appelé par une fonction qui n'est pas une méthode de la classe de base. Qt l'a conçu pour fonctionner de cette façon.

Une raison pour laquelle Qt désactive la copie de QObject s est qu'il gère la mémoire des enfants d'un QObject. Lorsqu'un QObject est supprimé, tous ses enfants le sont également. Ce serait impraticable de faire correctement si le QObject était copiable.

+0

Merci pour l'explication concise - cela m'a juste sauvé beaucoup de temps. (Je passais par valeur, pas de référence dans une fente pour ceux qui viennent à cela) –

2

Sur la ligne 574 que vous essayez de passer un de ces éléments à la fonction Productdetails. Vous ne le montrez pas, mais j'imagine que cette fonction prend une valeur. Le compilateur essaie donc de créer un nouvel objet pour le transmettre, mais cela n'est pas autorisé par la bibliothèque, qui a volontairement défini le constructeur de la copie comme privé.

Créez un nouvel objet explicitement ou corrigez la fonction appelée.