我有以下编译错误:
/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
HandleTCPClient.cpp第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;
}
感谢所有帮助=)
答案 0 :(得分:22)
Product
是QObject
的子类,无法复制。您的代码正试图将其复制到某处(可能在productDetails(tempProduct)
中),这会导致错误。也许你可以通过const引用将它传递给你的函数;或者可能需要重新设计你的程序。
您的编译器告诉您QObject
的复制构造函数是私有的,因此任何不是基类方法的函数都不能调用它。 Qt设计它以这种方式工作。
Qt禁用QObject
复制的一个原因是它管理QObject
子项的内存。当QObject
被删除时,其所有子项也将被删除。如果QObject
是可复制的,那么这样做是不切实际的。
答案 1 :(得分:4)
QObject后代不允许复制......
请参阅http://lists.trolltech.com/qt-interest/2001-02/thread00123-0.html
您的productDetails()函数按值获取其参数,从而需要复制。改为使用const引用。
答案 2 :(得分:2)
在第574行,您尝试将其中一项传递给productDetails函数。你没有展示它,但我想这个函数要么取值。因此编译器正在尝试创建一个全新的对象来传递它,但是库不允许这样做,它有意将复制构造函数设置为私有。
显式创建新对象,或修复被调用函数。