У меня проблемы с наследованием и полиморфизмом в C ++ - PullRequest
0 голосов
/ 28 сентября 2011

Я новичок в C ++, и я пытаюсь использовать наследование, но у меня есть ошибка. Это говорит

Ошибка 6, ошибка LNK1120: 2 неразрешенных внешних кода L: \ 2011-08 \ C ++ \ Assignment \ Drug Management \ Debug \ Drug Management.exe 1 1 Управление лекарствами

Есть три класса: Животное, Овца и Крупный рогатый скот. Что я сделал до сих пор:

//Animal.h
#ifndef ANI_H
#define ANI_H
#include <string>
#include "Treatment.h"
#include "jdate.h"

class Animal{
protected:
    int id;
    double weight;
    int yy;
    int mm;
    int dd;
    double dose;
    char sex;
    //Treatment treatArray[];
public:
    Animal();
    Animal(int newid, double newweight, int yy, int mm, int dd, double newdose, char newsex);
    ~Animal();
    virtual double calcDose();
    //void addAnimal();
    double getDaysDifference();
};
#endif

//Cattle.h
#ifndef CATT_H
#define CATT_H
#include "Animal.h"
#include <string>
using namespace std;

class Cattle : public Animal{
private:
    string category;
public:
    Cattle();
    Cattle(int newid, double newweight, int yy, int mm, int dd, 
           double newdose, char newsex, string newcategory);
    ~Cattle();
    virtual double calcDose();
    string getCategory();
};

#endif

//Animal.cpp
#include "Animal.h"

using namespace std;

Animal::Animal(int newid, double newweight, int yy, int mm, int dd, double newaccDose, char newsex)
{
    id = newid;
    weight = newweight;
    dose = newaccDose;
    sex = newsex;
}

double Animal::getDaysDifference(){
    jdate dateOfBirth(dd,mm,yy);
    jdate now;
    double diff = now-dateOfBirth;
    return diff;
}


//Cattle.cpp
#include "Cattle.h"



Cattle::Cattle(int newid, double newweight, int yy, int mm, int dd, 
           double newdose, char newsex, string newcategory)
    : Animal(id, weight, yy,mm,dd, dose, sex)
{
    id = newid;
    weight = newweight;
    dose = newdose;
    sex = newsex;
    Cattle::category = newcategory;
}

string Cattle::getCategory(){
    return category;
}

double Cattle::calcDose(){
    Cattle* c1;
    if(c1->getDaysDifference() < 90 || c1->getCategory() == "Meat"){
        c1->dose = 0;
        return c1->dose;
    }
    else if(c1->getCategory() == "Dairy"){
        if (c1->weight < 250 || c1->dose > 200){
            c1->dose = 0;
        }
        else{
            c1->dose = c1->weight * 0.013 + 46;
        }
        return c1->dose;
    }
    else if(c1->getCategory() == "Breeding"){
        if (c1->weight < 250 || c1->dose > 250){
            c1->dose = 0;
        }
        else{
            c1->dose = c1->weight * 0.021 + 81;
        }
        return c1->dose;
    }
    else
    {
        cout << "It is not valid category" << endl;
    }
}

Класс овец почти такой же, как у крупного рогатого скота. Я не уверен, что я на правильном пути. То, что я пытаюсь сделать, это наследовать (или полиморфизм) calcDose () в Cattle.cpp взяв из Animal.h. Можете ли вы дать мне совет?

Приветствия

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Вы объявили, но не определили конструктор по умолчанию и деструктор для Animal и Cattle (и, вероятно, других). Определите их или не объявляйте их (вам, вероятно, все же нужен деструктор, даже если он ничего не делает).

Другая проблема - ваш calcDose метод. Один из способов справиться с этим - сделать его «чисто виртуальным» в Animal: используйте virtual double calcDose() = 0;

Последняя проблема: не используйте use namespace std;. Никогда, никогда не используйте его в заголовочном файле.

0 голосов
/ 28 сентября 2011

Вы объявили calcDose в своем классе Animal, но не определили его.Если вы намеревались реализовать это просто в производных классах, то вы должны сделать его чисто виртуальным в своем классе Animal следующим образом:

virtual double calcDose() = 0;
0 голосов
/ 28 сентября 2011

Не видя весь код вашей программы или не указав, какие символы компоновщик не может найти, трудно точно сказать, на какие символы он жалуется, но в Animal отсутствует реализация для трех из его функций-членов, а Cattle отсутствует реализация для двух его функций-членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...