2014-10-26 16 views
1

我认为将代码放下会更容易,但我想要的是“重新创建”一个对象。 所以在简单的例子中,我有一个int类作为属性的类。当我使用 object = new Object();重新创建类时,int保持相同的值,但不会重置。“重新创建”C++中的对象不会重置属性的值。 (Qt)

下面是一个简单的问题的代码(它看起来过于复杂,但有一个原因):

的main.cpp

#include <iostream> 
#include "main.h" 

using namespace std; 

int main(int argc, const char * argv[]) { 
    Object *object = new Object(); 
    object->setNumber(4); 
    cout << endl << object->getNumber()<<endl; 
    restart(object); 
    cout << endl << object->getNumber()<<endl; 
    return 0; 
} 

void restart(Object *object) 
{ 
    object = new Object(); 
} 

main.h

#ifndef test_main_h 
#define test_main_h 
#include "object.h" 

void restart(Object *object); 

#endif 

object.cpp

using namespace std; 

Object::Object() 
{ 
    m_number = new int(2); 
} 

void Object::setNumber(int number) 
{ 
    m_number = new int(number); 
} 

int Object::getNumber() 
{ 
    return *m_number; 
} 

object.h

#ifndef __test__object__ 
#define __test__object__ 

#include <stdio.h> 

class Object 
{ 
public: 
    Object(); 
    void setNumber(int number); 
    int getNumber(); 

private: 
    int *m_number; 
}; 

#endif /* defined(__test__object__) */ 

所以输出会是:

4 

4 
Program ended with exit code: 0 

我们将在最后的输出需要2。

现在,如果你想知道为什么我做这一切,是因为我正在做一个程序使用Qt,和我有同样的问题,而是一个有点复杂:

的main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Main main; 
    main.show(); 
    return a.exec(); 
} 

mainwindow.h

#ifndef LESSON_H 
#define LESSON_H 

#include <QAudioProbe> 
#include <QAudioRecorder> 
#include <QDir> 
#include <QFileDialog> 
#include <QMediaRecorder> 
#include <fstream> 
#include <string> 
#include <QVariant> 
#include <QDir> 
#include <QtCore> 
#include <QtWidgets> 
#include <QMediaPlayer> 
#include <QKeyEvent> 

class MainWindow : public QWidget 
{ 
    Q_OBJECT 

public: 
    MainWindow(); 

private slots: 
    void togglePause(); 
    void toggleRecord(); 
    void setEnabled(); 

signals: 
    void end(); 

private: 
    QPushButton *m_record; 
    QPushButton *m_recordPause; 
    QPushButton *m_enableB; 
    bool m_enable; 
    QLabel *m_recordState; 
    QMediaPlayer *m_audio; 
    QAudioRecorder *m_audioRecorder; 
    QString m_dossier; 
}; 

class Main : public QWidget 
{ 
    Q_OBJECT 

public: 
    Main(); 
private slots: 
    void restart(); 

private: 
    MainWindow *main; 
}; 

#endif // LESSON_H 

mainwindow.cpp

#include "mainwindow.h" 

using namespace std; 

MainWindow::MainWindow() 
{ 

    m_record = new QPushButton("Record"); 
    m_recordPause = new QPushButton("Pause"); 
    m_recordPause->setEnabled(false); 
    m_enableB = new QPushButton("Paste enabled"); 
    m_recordState = new QLabel("Recording paused."); 
    m_recordState->setAlignment(Qt::AlignCenter); 

    m_enable = true; 

    QGridLayout *layout = new QGridLayout; 
    layout->addWidget(m_record,0,0,1,1); 
    layout->addWidget(m_recordPause,1,0,1,1); 
    layout->addWidget(m_enableB,2,0,1,1); 
    layout->addWidget(m_recordState,3,0,1,1); 
    setLayout(layout); 

    m_dossier = QFileDialog::getSaveFileName(this, "Save Audio File To:", QString(), "Audio (*.wav)"); 

    m_audioRecorder = new QAudioRecorder(this); 
    m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(m_dossier)); 
    m_audioRecorder->setAudioInput(m_audioRecorder->defaultAudioInput()); 

    QAudioEncoderSettings settings; 
    settings.setCodec("audio/amr"); 
    settings.setSampleRate(16000); 
    settings.setBitRate(32); 
    settings.setQuality(QMultimedia::HighQuality); 
    settings.setEncodingMode(QMultimedia::ConstantQualityEncoding); 

    m_audioRecorder->setEncodingSettings(settings); 

    m_audio = new QMediaPlayer; 
    m_audio->setMedia(QUrl::fromLocalFile(m_dossier)); 

    connect(m_recordPause, SIGNAL(clicked()), this, SLOT(togglePause())); 
    connect(m_record, SIGNAL(clicked()), this, SLOT(toggleRecord())); 
    connect(m_enableB, SIGNAL(clicked()), this, SLOT(setEnabled())); 
} 

void MainWindow::toggleRecord() 
{ 
    if (m_audioRecorder->state() == QMediaRecorder::StoppedState) { 
     m_record->setText("Stop"); 
     m_recordPause->setEnabled(true); 
     m_audioRecorder->record(); 
     m_recordState->setText("Recording."); 
    } 
    else 
    { 
     m_audioRecorder->stop(); 
     m_audio->setMedia(QUrl::fromLocalFile(m_dossier)); 
     emit end(); 
    } 
} 

     void MainWindow::togglePause() 
{ 
    if (m_audioRecorder->state() != QMediaRecorder::PausedState) 
    { 
     m_audioRecorder->pause(); 
     m_recordPause->setText("Resume"); 
     m_recordState->setText("Recording paused."); 
    } 
    else 
    { 
     m_audioRecorder->record(); 
     m_recordPause->setText("Pause"); 
     m_recordState->setText("Recording."); 
    } 
} 

    void MainWindow::setEnabled() 
{ 
    if(m_enable) 
    { 
     m_enableB->setText("Paste disabled"); 
     m_enable = false; 
    } 
    else 
    { 
     m_enableB->setText("Paste enable"); 
     m_enable = true; 
    } 
} 

Main::Main() 
{ 
    main = new MainWindow(); 
    QGridLayout *layout = new QGridLayout; 
    layout->addWidget(main,0,0,1,1); 
    setLayout(layout); 
    this->setFixedSize(200,200); 
    this->setWindowTitle("Notes"); 
    connect(main, SIGNAL(end()), this, SLOT(restart())); 
} 

void Main::restart() 
{ 
    main = new MainWindow(); 
} 

非常感谢您的帮助。

+0

尝试'void restart(Object ** object){delete * object; * object = new Object(); }'然后显然把它称为'restart(&object);'。 – lpapp 2014-10-26 22:50:06

+0

工作感谢! – user3371807 2014-10-26 22:51:46

回答

2

嗯,你需要了解指针如何在C和C++中工作。当你这样写:

void restart(Object *object) 
{ 
    object = new Object(); 
} 

要复制的指针和指向新创建的对象将被分配到函数内部的“内部”拷贝变量。我想,你打算写的是改变外面的指针。

此外,如果您将指针改为外部,则需要确保旧对象被破坏。

话虽如此,这是一个非常糟糕的重置对象的方式。在我看来,你应该忘记这个概念有几个原因。首先,它的性能可能会很高。你基本上破坏然后再构造。例如,如果你有足够的可用内存,我会建议缓存默认值,但毕竟这是所有关于权衡的,不是吗?

如果你仍然坚持它,在这里不用你需要在初步实践应用代码:

您将需要申请下面的代码:

void restart(Object **object) 
{ 
    delete *object; 
    *object = new Object(); 
} 

,然后调用你应该是这样的:

restart(&object);