2014-11-20 4 views
0

Попытка сделать программу тамагочи, но компилятор бросает неопределенная ссылка на «тамагочи :: возраст ошибки()использование класса над несколькими файлами .h .cpp main.cpp

Этот код будет идеально вернуть возраст Tamagotchi, который должен быть инициализирован до нуля в начале конструктором класса.

Я, очевидно, что-то испортил, но не знаю, где, если кто-нибудь увидит, где и может помочь мне понять, что было бы здорово!

Кроме того, если вы видите что-то плохое в практике кодирования, я новичок в этом, и я хочу улучшить, поэтому любая помощь приветствуется.

EDIT: whoops Я забыл скопировать и вставить определения функций из класса. Они есть, но я все еще получаю ошибку компилятора.

//tamagotchi.cpp 
#include "tamagotchi.h" 
#include <string> 


/* return of Tamagotchi information */ 
std::string Tamagotchi::name() {return myName;} 
int Tamagotchi::age() {return myAge;} 
int Tamagotchi::happiness() {return myHappiness;} 
int Tamagotchi::hunger() {return myHunger;} 
bool Tamagotchi::rIsSick() {return isSick;}  

-

//tamagotchi.h 
#ifndef TAMAGOTCHI_H 
#define TAMAGOTCHI_H 
#include <string> 


class Tamagotchi 
{ 
public: 
     /* initialization of default for tamagotchi */ 
     Tamagotchi() 
     : myName ("Default"), 
      myAge (0), 
      myHappiness (0), 
      myHunger (0), 
      isSick (false) { } 

/* returning tamagotchi variables */ 
     std::string name(); 
     int age(); 
     int happiness(); 
     int hunger(); 
     bool rIsSick(); 

private: 
     std::string myName; 
     int myAge;// defined from 0 - 50 based on hours 
     int myHappiness;// defined from 0 - 10 
     int myHunger; // defined from 0 - 10, greater is hungrier 
     bool isSick;// defines whether or not the Tamagotchi is sick 

}; 

#endif 

-

//main.cpp 
#include "tamagotchi.h" // defines tamagotchi class 
#include <string> 
#include <iostream> 


int main(){ 
    Tamagotchi myTamagotchi; 
    std::cout << myTamagotchi.age(); 
    return 0; 
} 

Благодаря

ответ

1

Вы должны объявить свои функции доступа (или какой-либо функции членов по этому вопросу) в файле заголовка в пределах класс:

class Tamagotchi 
{ 
public: 
     /* initialization of default for tamagotchi */ 
     Tamagotchi() 
     : myName ("Default"), 
      myAge (0), 
      myHappiness (0), 
      myHunger (0), 
      isSick (false) { } 
private: 
     std::string myName; 
     int myAge;// defined from 0 - 50 based on hours 
     int myHappiness;// defined from 0 - 10 
     int myHunger; // defined from 0 - 10, greater is hungrier 
     bool isSick;// defines whether or not the Tamagotchi is sick 
public: 
    std::string name(); 
    int age(); 
    int happiness(); 
    int hunger(); 
    bool rIsSick(); 
}; 

Некоторые советы: Это полезно объявить функции-члены, которые не изменяют состояние объекта как константы, например, так:

std::string name() const; 

Вы также должны изменить определение в файле CPP соответственно:

std::string Tamagotchi::name() const {...} 

Я также рекомендовал бы вам возвращать объекты контейнера, такие как станд :: строки по константной ссылке:

const std::string& name() const; 

Опять же, вы должны изменить определение в файле CPP:

const std::string& Tamagotchi::name() const { return myName; } 

Если вы вернуть его по значению, как вы есть, вы всегда будете создавать копию возвращаемой строки, которая может привести к снижению производительности , Возвращение с помощью ссылки const позволяет избежать этого. Это полезно только для контейнеров и других крупных объектов. Простые вещи, такие как примитивные типы (int, float, bool и т. Д.) И экземпляры небольших классов, могут быть возвращены по стоимости практически без затрат.

1

Компилятор прав ... класс, который вы определили, не содержит определений функций, только конструктор и некоторые частные переменные-члены. Недостаточно метать методы в файле .cpp. Если метод не указан в определении класса, то он не существует в отношении остальной части приложения!

class Tamagotchi 
{ 
public: 
     /* initialization of default for tamagotchi */ 
     Tamagotchi() 
     : myName ("Default"), 
      myAge (0), 
      myHappiness (0), 
      myHunger (0), 
      isSick (false) { } 

     std::string name(); 
     int age(); 
     int happiness(); 
     int hunger(); 
     bool rIsSick(); 

private: 
     std::string myName; 
     int myAge;// defined from 0 - 50 based on hours 
     int myHappiness;// defined from 0 - 10 
     int myHunger; // defined from 0 - 10, greater is hungrier 
     bool isSick;// defines whether or not the Tamagotchi is sick 
}; 
Смежные вопросы