2012-04-03 15 views
1

Ich versuche eine kleine Anwendung zu schreiben und bin mit auto_ptr auf einen Fehler bei der Kompilierung gestoßen.ISO C++ verbietet die Deklaration von 'auto_ptr' ohne Typ

Ich müde ursprünglich Erstellen eines intelligenten Zeigers mit Klasse ich erstellt, aber der gleiche Fehler tritt auf, wenn ich versuche und einen Smart-Zeiger des Typs Int erstellen, so muss es etwas anderes, was ich falsch mache. Ich folgte dem Beispiel here..

Ich habe das Gefühl, die Antwort darauf wird mich selbst schlagen.

Ich erkläre den Smart-Pointer am Ende dieser Datei.

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <memory.h> 
#include <QMainWindow> 
#include "dose_calac.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    /* 
    Some QT stuff here, removed for clarity/size... 
    */ 

private: 
    Ui::MainWindow *ui; 

    /* 
     Object for storage of data and calculation of DOSE index score. 
    */ 

    std::auto_ptr<int> pdoseIn(new int); // A simple set case, but sill produces an error!?! 

    std::auto_ptr<DOSE_Calac> pdoseIn(new DOSE_Calac); // Original code, error found here at first. 
}; 

#endif // MAINWINDOW_H 

und das ist meine Klasse, dose_calach.h.

#ifndef DOSE_CALAC_H 
#define DOSE_CALAC_H 

class DOSE_Calac 
{ 
public: 
// constructor 
    DOSE_Calac(); 
// set and get functions live here, removed for clarity/size. 

// function for caulating DOSE indexpoints 
    int CalcDOSEPoints(); 
private: 
    unsigned int dyspnoeaScale; 
    unsigned int fev1; 
    bool smoker; 
    unsigned int anualExacerbations; 
    unsigned int doseIndexPoints; 

}; 

#endif // DOSE_CALAC_H 

Jede Hilfe oder Vorschlag dankbar erhalten.

+3

Randnotiz: 'auto_ptr' ist in C++ 11 veraltet. – iammilind

Antwort

3

Ihr Fehler wird durch das Hinzufügen eines falschen Headers verursacht. Statt

#include <memory.h> 

Sie

#include <memory> 

auch schreiben sollte, gibt es mehr schwere Fehler in der Klassendefinition, weil Sie nicht Teilnehmer, auf diese Weise initialisieren können:

std::auto_ptr<int> pdoseIn(new int); 

Sie haben um es getrennt zu deklarieren und im Konstruktor zu initialisieren:

std::auto_ptr<int> pdoseIn; 
MainWindow() 
    : pdoseIn(new int) 
{} 
2

Sie können die Klassenelementvariablen nicht so initialisieren, Sie müssen sie in der Klassendeklaration definieren, indem Sie std::auto_ptr<int> a; ausführen und sie in ctor initialisieren, indem Sie a(new int) verwenden.

2

Sie können keine Datenelemente innerhalb der Klassendeklaration wie folgt initialisieren:

class MainWindow 
{ 
    std::auto_ptr<int> pdoseIn(new int); 
}; 

Sie müssen das Mitglied wie diese, erklären und das Datenelement im Konstruktor initialisieren:

class MainWindow 
{ 
    std::auto_ptr<int> pdoseIn; 
    MainWindow() 
     : pdoseIn(new int) 
    { 
    } 
};