2012-06-11 57 views
1

我試圖創建一個我創建的自定義項的向量,但我遇到了一個很奇怪的問題。自定義類的向量

當我創建我的類的實例時,我沒有任何問題,但是當我嘗試添加矢量時,我有一個很長的錯誤,我不知道該怎麼做。

我不知道它是否有幫助,但m_mesureList是類PanneauMesure的私有屬性。

宣言中的.H:

std::vector<Mesure> m_mesureList; 

用途:

void PanneauMesure::add(QPointF point1, QPointF point2, QPointF point3, QGraphicsItem *line1, QGraphicsItem *line2) 
{ 
    Mesure mesure(point1, point2, point3, line1, line2, this); 
    //m_mesureList.push_back(mesure); 
} 

錯誤:

In file included from ..\testQt\/PanneauMesure.h:21, 
       from ..\testQt\PanneauMesure.cpp:1: 
d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h: In copy constructor 'Mesure::Mesure(const Mesure&)': 
..\testQt\/Mesure.h:14: instantiated from 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Mesure]' 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/stl_vector.h:737: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Mesure, _Alloc = std::allocator<Mesure>]' 
..\testQt\PanneauMesure.cpp:104: instantiated from here 
d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h:806: error: 'QWidget::QWidget(const QWidget&)' is private 
..\testQt\/Mesure.h:14: error: within this context 
In file included from d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/mingw32/bits/c++allocator.h:34, 
       from d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/allocator.h:48, 
       from d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/string:43, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qstring.h:54, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qobject.h:48, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h:46, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/QWidget:1, 
       from ..\testQt\/PanneauMesure.h:4, 
       from ..\testQt\PanneauMesure.cpp:1: 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ext/new_allocator.h: In member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Mesure]': 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ext/new_allocator.h:105: note: synthesized method 'Mesure::Mesure(const Mesure&)' first required here 
In file included from ..\testQt\/PanneauMesure.h:21, 
       from ..\testQt\PanneauMesure.cpp:1: 
d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h: In member function 'Mesure& Mesure::operator=(const Mesure&)': 
..\testQt\/Mesure.h:14: 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 = Mesure, _Alloc = std::allocator<Mesure>]' 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/stl_vector.h:741: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Mesure, _Alloc = std::allocator<Mesure>]' 
..\testQt\PanneauMesure.cpp:104: instantiated from here 
d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h:806: error: 'QWidget& QWidget::operator=(const QWidget&)' is private 
..\testQt\/Mesure.h:14: error: within this context 
In file included from d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/vector:69, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qvector.h:52, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtGui/qbrush.h:47, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtGui/qpalette.h:47, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/qwidget.h:49, 
       from d:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/QWidget:1, 
       from ..\testQt\/PanneauMesure.h:4, 
       from ..\testQt\PanneauMesure.cpp:1: 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/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 = Mesure, _Alloc = std::allocator<Mesure>]': 
d:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/vector.tcc:312: note: synthesized method 'Mesure& Mesure::operator=(const Mesure&)' first required here 

編輯,如果它可以幫助:

Mesure.cpp:

Mesure::Mesure(QPointF point1, QPointF point2, QPointF point3, QGraphicsItem *line1, QGraphicsItem *line2, QWidget *parent): 
    QWidget(parent), 
    m_hlayoutMesure(new QHBoxLayout(this)), 
    m_buttonClose(new QToolButton(this)), 
    m_labelAngle(new QLabel(this)), 
    m_checkboxMesure(new QCheckBox(this)), 
    m_point1(point1), 
    m_point2(point2), 
    m_point3(point3), 
    m_line1(line1), 
    m_line2(line2), 
    m_angle(0) 
{ 
    m_buttonClose->setText("X"); 
    m_labelAngle->setAlignment(Qt::AlignCenter); 
    m_checkboxMesure->setChecked(true); 
    m_hlayoutMesure->addWidget(m_checkboxMesure); 
    m_hlayoutMesure->addWidget(m_labelAngle); 
    m_hlayoutMesure->addWidget(m_buttonClose); 
    m_hlayoutMesure->setSpacing(10); 
    m_hlayoutMesure->setMargin(0); 
    QObject::connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(close())); 
} 

PanneauMesure.cpp:

PanneauMesure::PanneauMesure(QWidget *parent) : 
    QWidget(parent), 
    m_vlayoutTotal(new QVBoxLayout(this)), 
    m_groupboxMesures(new QGroupBox("Mesures", this)), 
    m_vlayoutGroupBoxMesures(new QVBoxLayout(m_groupboxMesures)), 
    m_scrollareaMesures(new QScrollArea(m_groupboxMesures)), 
    m_widgetMesures(new QWidget(m_groupboxMesures)), 
    m_hlayoutMesures(new QHBoxLayout(m_widgetMesures)), 
    m_vlayoutMesures(new QVBoxLayout(m_widgetMesures)), 
    m_groupboxOptions(new QGroupBox("Options", this)), 
    m_vlayoutOptions(new QVBoxLayout(m_groupboxOptions)), 
    m_buttonRAZ(new QPushButton("Remise à zéro", m_groupboxOptions)), 
    m_widgetAlpha(new QWidget(m_groupboxOptions)), 
    m_hlayoutAlpha(new QHBoxLayout(m_widgetAlpha)), 
    m_labelAlphaText(new QLabel("Alpha :", m_groupboxOptions)), 
    m_labelAlphaValeur(new QLabel("50", m_groupboxOptions)), 
    m_sliderAlpha(new QSlider(m_groupboxOptions)), 
    m_hlayoutCouleur(new QHBoxLayout(m_groupboxOptions)), 
    m_labelCouleur(new QLabel("Couleur :", m_groupboxOptions)), 
    m_buttonCouleur(new QToolButton(m_groupboxOptions)), 
    m_couleur(Qt::yellow), 
    m_hlayoutLongueur(new QHBoxLayout(m_groupboxOptions)), 
    m_labelLongueur(new QLabel("Longueur : ", m_groupboxOptions)), 
    m_spinboxLongueur(new QSpinBox(m_groupboxOptions)), 
    m_longueur(20), 
    m_hlayoutLargeur(new QHBoxLayout(m_groupboxOptions)), 
    m_labelLargeur(new QLabel("Largeur :", m_groupboxOptions)), 
    m_spinboxLargeur(new QSpinBox(m_groupboxOptions)), 
    m_largeur(5), 
    m_mesureList() 
{ 
    // Alpha 
    m_sliderAlpha->setMaximum(100); 
    m_sliderAlpha->setValue(50); 
    m_hlayoutAlpha->addWidget(m_labelAlphaText); 
    m_hlayoutAlpha->addWidget(m_labelAlphaValeur); 
    m_labelAlphaText->setAlignment(Qt::AlignRight); 
    m_labelAlphaValeur->setAlignment(Qt::AlignLeft); 
    m_sliderAlpha->setOrientation(Qt::Horizontal); 
    QObject::connect(m_sliderAlpha, SIGNAL(valueChanged(int)), m_labelAlphaValeur, SLOT(setNum(int))); 

    // Couleur 
    QPixmap px(20, 20); 
    px.fill(m_couleur); 
    m_buttonCouleur->setIcon(px); 
    m_hlayoutCouleur->addWidget(m_labelCouleur); 
    m_hlayoutCouleur->addStretch(2); 
    m_hlayoutCouleur->addWidget(m_buttonCouleur); 
    m_hlayoutCouleur->addStretch(1); 
    QObject::connect(m_buttonCouleur, SIGNAL(clicked()), this, SLOT(ouvrirCouleur())); 

    // Longueur 
    m_spinboxLongueur->setMinimum(1); 
    m_spinboxLongueur->setValue(m_longueur); 
    m_spinboxLongueur->setMaximum(999); 
    m_hlayoutLongueur->addWidget(m_labelLongueur); 
    m_hlayoutLongueur->addStretch(1); 
    m_hlayoutLongueur->addWidget(m_spinboxLongueur); 
    QObject::connect(m_spinboxLongueur, SIGNAL(valueChanged(int)), this, SLOT(sendParam())); 

    // Largeur 
    m_spinboxLargeur->setMinimum(1); 
    m_spinboxLargeur->setMaximum(100); 
    m_spinboxLargeur->setValue(m_largeur); 
    m_hlayoutLargeur->addWidget(m_labelLargeur); 
    m_hlayoutLargeur->addStretch(1); 
    m_hlayoutLargeur->addWidget(m_spinboxLargeur); 
    QObject::connect(m_spinboxLargeur, SIGNAL(valueChanged(int)), this, SLOT(sendParam())); 

    // Options 
    m_vlayoutOptions->addWidget(m_buttonRAZ); 
    m_vlayoutOptions->addWidget(m_widgetAlpha); 
    m_vlayoutOptions->addWidget(m_sliderAlpha); 
    m_vlayoutOptions->addLayout((m_hlayoutCouleur)); 
    m_vlayoutOptions->addLayout((m_hlayoutLongueur)); 
    m_vlayoutOptions->addLayout((m_hlayoutLargeur)); 
    m_vlayoutOptions->setSpacing(0); 
    QObject::connect(m_buttonRAZ, SIGNAL(clicked()), this, SLOT(remiseAZero())); 

    // Mesures 
    m_vlayoutMesures->addStretch(1); 
    m_hlayoutMesures->addStretch(1); 
    m_hlayoutMesures->addLayout(m_vlayoutMesures); 
    m_hlayoutMesures->addStretch(1); 
    m_widgetMesures->setLayout(m_hlayoutMesures); 
    m_scrollareaMesures->setWidgetResizable(true); 
    m_scrollareaMesures->setWidget(m_widgetMesures); 
    m_scrollareaMesures->setFrameShape(QFrame::NoFrame); 
    m_vlayoutGroupBoxMesures->addWidget(m_scrollareaMesures); 
    m_vlayoutGroupBoxMesures->setMargin(0); 

    // Total 
    m_vlayoutTotal->addWidget(m_groupboxOptions); 
    m_vlayoutTotal->addWidget(m_groupboxMesures); 

} 

void PanneauMesure::add(QPointF point1, QPointF point2, QPointF point3, QGraphicsItem *line1, QGraphicsItem *line2) 
{ 
    Mesure mesure(point1, point2, point3, line1, line2, this); 
    m_mesureList.push_back(mesure); 
    //m_vlayoutMesures->insertWidget(0, &m_mesure); 
    //QObject::connect(m_buttonRAZ, SIGNAL(clicked()), &m_mesure, SLOT(close())); 
} 

void PanneauMesure::remiseAZero() 
{ 
    m_sliderAlpha->setValue(50); 
    m_longueur = 20; 
    m_spinboxLongueur->setValue(m_longueur); 
    m_largeur = 5; 
    m_spinboxLargeur->setValue(m_largeur); 
    m_couleur = Qt::yellow; 
    QPixmap px(20, 20); 
    px.fill(m_couleur); 
    m_buttonCouleur->setIcon(px); 
    emit changementParam(m_couleur, m_longueur, m_largeur); 
} 

void PanneauMesure::ouvrirCouleur() 
{ 
    QColor color = QColorDialog::getColor(m_couleur); 
    if (color.isValid()) m_couleur=color; 
    QPixmap px(20, 20); 
    px.fill(m_couleur); 
    m_buttonCouleur->setIcon(px); 
    emit changementParam(m_couleur, m_longueur, m_largeur); 
} 

void PanneauMesure::sendParam() 
{ 
    m_longueur = m_spinboxLongueur->value(); 
    m_largeur = m_spinboxLargeur->value(); 
    emit changementParam(m_couleur, m_longueur, m_largeur); 
} 
+0

您是否爲您的班級定義了copy-ctor? – dirkgently

+0

我不這麼認爲,因爲我不知道copy-ctor是什麼。 – Leo

+0

複製構造函數通常需要執行對象的「深層」副本。它創建它自己的所有基本類型和對象的實例,以便它不引用原始內容。如果程序員沒有定義複製構造函數,編譯器將默認構建一個,這通常會導致共享引用。 –

回答

2

隨着K-假面舞會指出,你不能有未拷貝構造元素的序列我只是存儲的指針的順序是這樣的:

聲明:

std::vector<Mesure*> m_mesureList; 

功能:

void PanneauMesure::add(QPointF point1, QPointF point2, QPointF point3, QGraphicsItem *line1, QGraphicsItem *line2) 
{ 
    Mesure* mesure = new Mesure(point1, point2, point3, line1, line2, this); 
    m_mesureList.push_back(mesure); 
} 
+1

並且要小心最終去掉這些指針中的每一個... –

+0

爲了更方便的語義,使用[Boost Pointer Containers](http://www.boost.org/doc/libs)可能是一個好主意/1_49_0/libs/ptr_container/doc/ptr_container.html)。 (ptr_vector等於向量)。 –

+0

@ K-Ballo當Mesure從QWidget繼承時,調用close()SLOT還是必須手動刪除它們才足夠? – Leo

6

從錯誤日誌似乎Mesure繼承或包含QWidget,這是不可複製。在C++ 03中,要放置在序列中的類型的要求是它們是可複製的,而您的類型不是。