2013-04-28 14 views
5

Uważam się za początkującego programistę C++ i nigdy wcześniej nie doświadczyłem tego błędu.: żadna funkcja "__________" nie została zadeklarowana w klasie "_______"

Ja po prostu próbuje utworzyć klasę dla mojej funkcji, ale wszystkie moje std :: prefiksem funkcje zadeklarowane w moim pliku nagłówka nie są uznawane

//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
#ifndef PERSON_H 
#define PERSON_H 

#include <string> 

class Person 
{ 
    public: 
     Person(); 
     std::string getName(); //return first name 
     std::string getSurname();//return surname 
     int getWeight(); //return weight 
     int getBirthYear(); //return birthyear 


    private: 
//self explanatory member variables but need to be accessible to patient 
     std::string m_name; 
     std::string m_surname; 
     int m_weight; 
     int m_birthYear; 
}; 

#endif  

.cpp

//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
#include "Person.h" 

Person::Person() 
{ 
    m_name = "name"; 
    m_surname = "surname"; 
    m_weight = 0; 
    m_birthYear = 0; 
    return; 
} 

//returns m_name 
std::string Person::getName() 
{ 
    return m_name; 
} 

//returns m_surname 
std::string Person::getSurname() 
{ 
    return m_surname; 
} 

//returns persnon's weight 
int Person::getWeight() 
{ 
    return m_weight; 
} 

//returns the person's birth year 
int Person::getBirthYear() 
{ 
    return m_birthYear; 
} 

main

//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
//comments 
#include "Person.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
// Person matt; 
// cout << matt.getName() << endl; 
// cout << matt.getSurname() << endl; 
// cout << matt.getWeight() << endl; 
// cout << matt.getBirthYear() << endl; 
    return 0; 
} 

I to jest błąd Otrzymuję

g++ Main.cpp Person.h Person.cpp -o test 
Person.cpp: In constructor ‘Person::Person()’: 
Person.cpp:17:2: error: ‘m_name’ was not declared in this scope 
Person.cpp:18:2: error: ‘m_surname’ was not declared in this scope 
Person.cpp: At global scope: 
Person.cpp:35:29: error: no ‘std::string Person::getName()’ member function declared in class ‘Person’ 
Person.cpp:41:32: error: no ‘std::string Person::getSurname()’ member function declared in class ‘Person’ 

Jakieś pomysły, co robię źle? To dokładnie to samo formatowanie std :: pracowało wcześniej dla mnie, ale z jakiegoś powodu teraz tylko funkcje std :: string nie są rozpoznawane podczas próby utworzenia prostej klasy Person.

+7

Co robi nagłówek w komendzie budowania? A co ludzie mają przeciwko listom inicjalizacyjnym konstruktora? – chris

+0

Niestety, jest to jedyny sposób, w jaki nauczyłem się programować i preferowany przez moich nauczycieli/znaczników, ponieważ łatwiej im je przeglądać. –

+8

Cóż, twoi nauczyciele nie mają racji. Poproś o zwrot pieniędzy. – juanchopanza

Odpowiedz

9

Z uwag:

g++ Main.cpp Person.h Person.cpp -o test 

Jako Chris wskazał, niezwykłe jest to pliki nagłówka w wierszu polecenia kompilacji. Nieco inne wezwanie, które prawdopodobnie używane wcześniej:

g++ -c Main.cpp Person.h Person.cpp 

tworzy Main.o, Person.o, ale także Person.h.gch prekompilowana nagłówka. Prekompilowany nagłówek nie jest regenerowany przy użyciu bieżącego polecenia kompilacji, ale nadal jest używany, więc zmiany do Person.h nie zostaną pobrane.

Powiązane problemy