2013-03-11 13 views
25

Ostatnio stworzyłem klasę Square:Czy konieczne jest zdefiniowanie listy inicjalizacji w pliku nagłówkowym?

========= pliku nagłówka ======

class Square 
{ 
    int m_row; 
    int m_col; 

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

========== plik cpp == ====

#include "Square.h" 

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

ale potem otrzymuję wiele błędów. Jeśli usunąć plik cpp i zmienić plik nagłówka do:

========= pliku nagłówka ======

class Square 
{ 
    int m_row; 
    int m_col; 

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

spełnia on żadnych błędów. Czy to znaczy, że lista inicjalizacyjna musi pojawić się w pliku nagłówkowym?

+0

żadnych oznak badań przed wysłaniem i brak wskazania, co "dużo błędów" było, a jednak było na +9? –

Odpowiedz

23

Można mieć

============== plik header ================

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

nie _wyjaśnia problem i dlaczego to naprawia. –

+1

Lista inicjalizacji @underscore_d jest częścią ** definicji **, więc musisz umieścić listę w miejscu, gdzie używana jest definicja/body/** {} ** – fider

3

Niewymagane. Może być również zaimplementowany w pliku źródłowym.

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

lista inicjalizacji pojawia się z definicją konstruktora, a nie z deklaracją, która nie jest definicją. Tak, opcje są albo:

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

w definicji klasy lub innego:

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

w definicji klasy i:

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

gdzie indziej. "Gdzie indziej" może znajdować się w nagłówku, jeśli zrobisz to inline.

+0

dzięki! Rozumiem! – E235

40

lista inicjalizacji jest częścią konstruktora definicji więc trzeba zdefiniować go w tym samym miejscu można zdefiniować ciało konstruktora. Oznacza to, że można mieć go albo w pliku nagłówka:

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

lub w pliku .cpp:

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

ale kiedy masz definicję w pliku .cpp, to w pliku nagłówka, nie powinna być tylko deklaracją:

public: 
    Square(int row, int col); 
+0

Powinieneś usunąć dodatkowy średnik z pierwszego przykładu kodu. – firegurafiku

0

Ten rodzaj inicjowania zmiennej o nazwie lista inicjalizacji członka. Lista inicjalizacji użytkownika może być używana w pliku nagłówkowym lub źródłowym. To nie ma znaczenia. Ale konstruktor musi mieć definicję, gdy zainicjujesz go w pliku nagłówkowym. Aby uzyskać więcej informacji, możesz przejść pod numer C++ Member Initialization List.

Powiązane problemy