Возможно ли это в C ++?toString (ClassName * class) - PullRequest
0 голосов
/ 03 октября 2011

Я бы хотел использовать toString с аргументом класса, но по какой-то причине произошла ошибка.Код:

Animal.h

#include "Treatment.h"
#include "jdate.h"
#include <vector>

class Animal{
protected:
    int id;
    double weight;
    int yy;
    int mm;
    int dd;
    double accDose;
    char sex;
    vector<Treatment*> treatArray;
public:
    Animal();
    Animal(int newid, double newweight, int yy, int mm, int dd, char newsex, vector<Treatment*> treatArray);
    ~Animal();
};

Обработка.cpp

#include "Treatment.h"

using namespace std;

Treatment::Treatment(int newid,jdate newdayTreated, double newdose){
    id=newid;
    dayTreated = newdayTreated;
    dose = newdose;
}

Treatment::Treatment(){
    id=0;
    dose=0;
}
Treatment::~Treatment(){}

string Treatment::toString(Animal* a)
{
    string aa;
    return aa;
}

toString находится в классе обработки.Я не уверен, но я думаю, что это потому, что у Animal есть вектор TreatArray ;.Это действительно имеет значение?Извините, что я не могу поместить сообщения об ошибках здесь, потому что, как только я объявляю toString, по какой-то причине возникают тонны ошибок, например

Error   1   error C2065: 'Treatment' : undeclared identifier    l:\2011-08\c++\assignment\drug management\drug management\animal.h  30  1   Drug Management

Ответы [ 4 ]

5 голосов
/ 03 октября 2011
// Animal.h
// #include "Treatment.h"   remove this

class Treatmemt;    // forward declaration

class Animal
{
    ...
};

В вашей версии Treatment.h и Animal.h включают друг друга.Вам необходимо разрешить эту циклическую зависимость, используя предварительное объявление.В .cpp файлы включите все необходимые h-файлы.

2 голосов
/ 03 октября 2011

Вы включаете Animal.h в Treatment.h до того, как будет определен класс Treatment, поэтому вы получаете сообщение об ошибке.

Используйте предварительное объявление для решения этой проблемы:

Animal.h добавить строку

class Treatment;
0 голосов
/ 03 октября 2011

Есть несколько проблем с вашим кодом. Прежде всего, Animal.h должен иметь охрану включения, так как Treatment.h имеет:

#ifndef ANIMAL_H
#define ANIMAL_H

// Your code here

#endif

Я бы также предложил, чтобы вы дали более длинное имя охраннику Treatment.h, вы снизите риск использования того же имени в другом месте.

Использование охранников гарантирует, что у вас нет кругового включения. Тем не менее у вас есть циклическая зависимость, потому что класс Treatment должен знать о классе Animal и наоборот. Однако, поскольку в обоих случаях вы использовали указатели на другой класс, полные определения не требуются, и вы можете - на самом деле - заменить в обоих заголовочных файлах включение другого с помощью простого объявления. Например, в Animal.h удалить

#include "Treatment.h"

и добавьте

class Treatment;

И Treatment.cpp, и Animal.cpp должны включать в себя Treatment.h и Animal.h.

0 голосов
/ 03 октября 2011

Вы не использовали std пространство имен в обоих заголовочных файлах.

Итак, используйте std::string вместо string. Потому что string определено в std пространстве имен.

Одновременно используйте std::vector вместо vector.

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