2013-03-11 9 views
25

Kürzlich habe ich Klasse Square:Ist es erforderlich, die Initialisierungsliste in einer Header-Datei zu definieren?

========= Header-Datei ======

class Square 
{ 
    int m_row; 
    int m_col; 

public: 
    Square(int row, int col): m_row(row), m_col(col) 
}; 

========== CPP-Datei == ====

#include "Square.h" 

Square::Square(int row, int col) 
{ 
    cout << "TEST"; 
} 

aber dann bekomme ich viele Fehler. Wenn ich die CPP-Datei entfernen und die Header-Datei ändern: ohne Fehler

========= Header-Datei ======

class Square 
{ 
    int m_row; 
    int m_col; 

public: 
    Square(int row, int col): m_row(row), m_col(col) {}; 
}; 

Vorschriften erfüllt. Bedeutet das, dass die Initialisierungsliste in der Header-Datei erscheinen muss?

+0

keine Spur von Forschung vor dem Posten und keine Angabe, was die "viele Fehler" waren, und doch war es bei +9? –

Antwort

23

können Sie haben

============== Header-Datei ================

class Square 
{ 
    int m_row; 
    int m_col; 

public: 
    Square(int row, int col); 
}; 

================== cpp ====================

Square::Square(int row, int col):m_row(row), m_col(col) 
{} 
+4

nicht _explain_ das Problem und warum dies behebt es. –

+1

@underscore_d Initialisierungsliste ist ein Teil von ** Definition **, also müssen Sie eine Liste einfügen, wo die Definition/Körper/** {} ** verwendet wird – fider

3

Keine Anforderung. Es kann auch in einer Quelldatei implementiert werden.

// In a source file 
Square::Square(int row, int col): m_row(row), 
            m_col(col) 
{} 
8

Die Die Initialisierungsliste wird mit der Konstruktordefinition angezeigt, nicht mit einer Deklaration, die keine Definition ist. So sind Ihre Möglichkeiten entweder:

Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition 

in der Klassendefinition oder aber:

Square(int row, int col); // ctor declaration 

in der Klassendefinition und:

Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition 

anderswo. "Anderswo" darf in der Kopfzeile sein, wenn Sie es inline machen.

+0

danke !! Ich verstehe! – E235

40

Initialisierung Liste ist Teil Definition Konstruktor so müssen Sie es an der gleichen Stelle definieren Sie Konstruktor Körper definieren. Das bedeutet, dass Sie es entweder in Ihrem Header-Datei haben:

public: 
    Square(int row, int col): m_row(row), m_col(col) {}; 

oder in CPP-Datei:

Square::Square(int row, int col) : m_row(row), m_col(col) 
{ 
    // ... 
} 

aber wenn Sie Definition in CPP-Datei, dann in Header-Datei gibt sollte nur seine Deklaration sein:

+0

Sie sollten das zusätzliche Semikolon aus dem ersten Codebeispiel entfernen. – firegurafiku

0

Diese Art der Initialisierung einer Variablen namens Member Initialisierungsliste. Die Mitgliederinitialisierungsliste kann in der Header-Datei oder der Quelldatei verwendet werden. Das ist egal. Der Konstruktor muss jedoch eine Definition haben, wenn Sie ihn in der Header-Datei initialisieren. Sie können sich auf C++ Member Initialization List für weitere Details beziehen.