这在C ++中是否可行? toString(ClassName * class)

时间:2011-10-03 08:03:41

标签: c++ visual-c++

我想在类参数中使用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();
};

Treatment.h

#ifndef TRE_H
#define TRE_H
#include <string>
#include <sstream>
#include "jdate.h"
#include "Animal.h"
#include "Cattle.h"
#include "Sheep.h"

class Treatment{
private:
    int id;
    jdate dayTreated;
    double dose;
public:
    Treatment(int id,jdate dayTreated, double dose);
    Treatment();
    ~Treatment();
    string toString(Animal* a);
};
#endif

Treatment.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在Treatment类中。我不确定,但我认为这是因为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 个答案:

答案 0 :(得分:5)

// Animal.h
// #include "Treatment.h"   remove this

class Treatmemt;    // forward declaration

class Animal
{
    ...
};

在您的版本中,Treatment.h和Animal.h互相包含。您需要使用前向声明来解决此循环依赖关系。在.cpp文件中,包含所有必需的h文件。

答案 1 :(得分:2)

在定义类Treatment之前,您在Treatment.h中包含了Animal.h,这就是您收到错误的原因。

使用前向声明解决此问题:

在Animal.h中添加行

class Treatment;

答案 2 :(得分:0)

您没有在两个头文件中使用std命名空间。

因此,请使用std::string代替string。因为stringstd命名空间中定义。

Simillarly使用std::vector代替vector

答案 3 :(得分:0)

您的代码存在一些问题。首先,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.cppAnimal.cpp都必须同时包含Treatment.hAnimal.h