我想用Qt庫創建爲我的應用控制面板,爲了這個,我創建類 Controls
類的std :: auto_ptr的包含對象的矢量行爲異常
Controls
:創建一個滑塊和自旋和標籤以水平佈局來組織它們。
但是當我想創建std::vector<Controls>
該程序運行沒有錯誤,但現在控制正在創建!所以爲什麼沒有控制。
Controls.h
class Controls
{
private:
QHBoxLayout Layout ;
string Controlname;
std::auto_ptr<QLabel> Label ;
std::auto_ptr<QSlider> Slider ;
std::auto_ptr<QSpinBox> Spin ;
public:
Controls();
Controls(QLayout &Parent , string name , const int &Default_value);
Controls(const Controls ©);
~Controls();
QLabel *const Get_Label()const { return Label.get() ; }
QSlider *const Get_Slider()const { return Slider.get() ; }
QSpinBox *const Get_Spin()const { return Spin.get() ; }
QHBoxLayout *const Get_Layout() {return &Layout;}
void SetValue(const int &newvalue);
Controls &operator= (const Controls ©);
};
Controls.cpp
Controls &Controls::operator= (const Controls ©)
{
Label = std::auto_ptr<QLabel> (new QLabel()) ;
Slider = std::auto_ptr<QSlider> (new QSlider()) ;
Spin = std::auto_ptr<QSpinBox> (new QSpinBox()) ;
this->Controlname = copy.Controlname ;
this->Slider.get()->setValue(copy.Slider.get()->value());
this->Spin.get()->setValue(copy.Spin.get()->value());
return *this ;
}
Controls::Controls(const Controls ©)
{
this->Controlname = copy.Controlname ;
this->Slider.get()->setValue(copy.Slider.get()->value());
this->Spin.get()->setValue(copy.Spin.get()->value());
}
Controls::Controls()
{
Label = std::auto_ptr<QLabel> (new QLabel()) ;
Slider = std::auto_ptr<QSlider> (new QSlider()) ;
Spin = std::auto_ptr<QSpinBox> (new QSpinBox()) ;
Slider->setValue(0);
Slider->setOrientation(Qt::Horizontal);
Label->setText(QString ("unamed"));
Spin->setValue(0);
Layout.addWidget(Label.get() , 0 , 0);
Layout.addWidget(Slider.get() , 0 , 0);
Layout.addWidget(Spin.get() , 0 , 0);
QObject::connect(Slider.get() , SIGNAL(valueChanged(int)) , Spin.get() , SLOT(setValue(int)));
QObject::connect(Spin.get() , SIGNAL(valueChanged(int)) , Slider.get() , SLOT(setValue(int)));
}
Controls::Controls(QLayout &Parent , string name , const int &Default_value)
{
Controlname = name ;
Label = std::auto_ptr<QLabel> (new QLabel()) ;
Slider = std::auto_ptr<QSlider> (new QSlider()) ;
Spin = std::auto_ptr<QSpinBox> (new QSpinBox()) ;
Slider->setValue(Default_value*100);
Slider->setOrientation(Qt::Horizontal);
Label->setText(QString (name.c_str()));
Spin->setValue(Default_value*100);
Layout.addWidget(Label.get() , 0 , 0);
Layout.addWidget(Slider.get() , 0 , 0);
Layout.addWidget(Spin.get() , 0 , 0);
QObject::connect(Slider.get() , SIGNAL(valueChanged(int)) , Spin.get() , SLOT(setValue(int)));
QObject::connect(Spin.get() , SIGNAL(valueChanged(int)) , Slider.get() , SLOT(setValue(int)));
Parent.addItem(&Layout);
}
void Controls::SetValue(const int &newvalue)
{
Slider.get()->setValue(newvalue);
}
Controls::~Controls()
{
}
的main.cpp
int main(int argc, char *argv[])
{
QApplication app (argc , argv);
QVBoxLayout layout ;
auto_ptr<QWidget> Panel = auto_ptr<QWidget> (new QWidget()) ;
vector<Controls> g ;
g.push_back(Controls(layout , "WHITE_BALANCE_RED_V" , 56));
Panel.get()->setLayout(&layout);
Panel.get()->show();
return app.exec();
}
編輯:
i。從除去auto_ptr的析構函數〜控制,並且當我再次運行它此異常
pure virtual method called
terminate called without an active exception
- 我初始化滑塊和旋轉的拷貝構造函數
沒有進一步,很明顯這個程序有未定義的行爲,因爲(在' Controls()')你明確地調用了'auto_ptr'成員的析構函數,然後它們作爲'Controls'的正常破壞的一部分被隱式地銷燬。 – Mankarse
如果使用'auto_ptr',不要在其中放入析構函數。 [規則零](http://rmartinho.github.com/2012/08/15/rule-of-zero.html)。 –
thak你!我刪除了auot_ptr析構函數,並且我的程序拋出了這種叫做 的純虛方法,但沒有激活異常終止調用 – user1728234