我正在尝试使用toString
,但我遇到了问题。
我第二次问这个问题,因为我之前第一次询问的信息不足。我只是担心问题的长短。对于那个很抱歉。
toString在Animal
类中,Animal
类有vector<Treatment> treatArray;
作为数据成员,但问题是我可以使用数据成员本身,但我无法获取数据treatArray
的成员。这些是我的代码:
Animal.h
#ifndef ANIMAL_H
#define ANIMAL_H
#include "jdate.h"
//#include "Treatment.h"
#include <vector>
#include <sstream>
class Treatment;
class Animal{
protected:
int id;
double weight;
int yy;
int mm;
int dd;
double dose;
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();
void setTreatArray(vector<Treatment*> treatArray);
vector<Treatment*> getTreatArray();
string toString();
};
Treatment.h
#ifndef TREATMENT_H
#define TREATMENT_H
#include "jdate.h"
class Treatment{
private:
int id;
jdate dayTreated;
double dose;
double accDose;
public:
Treatment(int id,jdate dayTreated, double dose);
Treatment();
~Treatment();
};
#endif
Animap.cpp
#include "Animal.h"
//using namespace std;
Animal::Animal(int newid, double newweight, int yy, int mm, int dd, char newsex, vector<Treatment*> treatArray)
{
id = newid;
weight = newweight;
yy = yy;
mm = mm;
dd = dd;
dose = 0;
accDose = 0;
sex = newsex;
}
Animal::Animal()
{
id = 0;
weight = 0;
yy = 0;
mm = 0;
dd = 0;
dose = 0;
accDose = 0;
sex = ' ';
}
void Animal::setTreatArray(vector<Treatment*> treatArray){treatArray = treatArray;}
vector<Treatment*> Animal::getTreatArray(){return treatArray;}
string Animal::toString()
{
jdate DOB(getYY(),getMM(),getDD());
ostringstream ostr;
ostr<<"Cattle / Sheep: "<<getSex()<<", Weight: "<<getWeight()
<<" kg. DOB: " <<DOB.toString()<<" Accum Dose " <<getAccDose() << "mg" << endl;
if(getTreatArray().size()==0)
ostr<<"\n No History Found\n";
else
{
for(int i=0;i<getTreatArray().size();i++)
{
//UNTIL HERE, NO ERROR FOUND, BUT ERROR OCCURS FROM THE STATEMENT BELOW
ostr<<" Treatment: " << getTreatArray().at(i)->getID() << " "
<<getTreatArray().at(i)->getDayTreated().toString()<< " "
<<getTreatArray().at(i)->getDose() <<"mg\n";
}
}
return ostr.str();
}
每个班级都有setter和getter,我把它剪下来。
另外,我认为这是因为载体的初始化,但我搜索了关于初始化向量,并且它说向量是自动初始化的,所以我不必手动初始化。现在我不知道是什么问题:( 错误消息是:
1 IntelliSense: pointer to incomplete class type is not allowed l:\2011-08\c++\assignment\drug management\drug management\animal.cpp 97 30 Drug Management
答案 0 :(得分:3)
您应该在Treatment.h
中加入Animal.cpp
。
编辑:要扩展原因,错误消息会转换为:
“我看到你宣布了一个叫做治疗的课程。但我没有看到它的实施!”。
因此,为了让编译器在您访问类Treatment
成员的位置查看其实现,您需要在#include Treatment.h
中Animal.cpp
。我看到你不希望它出现在Animal.h
中的原因,因为Animal.h
中包含Treatment.h
,这可能会导致编译器遇到如下问题:
“好的!我正在解析Animal.cpp ......
- 它包括Animal.h ...
- 我要扩展Animal.h ...
- Animal.h包括Treatment.h ...
---我要扩展Treatment.h ...
--- Treatment.h包括Animal.h ...
----我要扩展Animal.h ....
----(循环)“
#pragma once
或#ifdef
警卫可以避免这种情况。但是当它们开始运作时,编译器会这样:
“好的!我正在解析Animal.cpp ......
- 它包括Animal.h ...
- 我要扩展Animal.h ...
- Animal.h包括Treatment.h ...
---我要扩展Treatment.h ...
--- Treatment.h正在使用名为Animal的类...
---动物的定义是什么?....错误!
---(编译器没有达到定义类Animal的程度!)
它还取决于编译器是使用Treatment.cpp还是Animal.cpp启动的。如果是Treatment.cpp,它会抱怨缺少治疗的定义(恰恰与动物身上发生的情况相反)。
现在你已经向Animal.h
中的编译器声明了“留意一个名为Treatment的类”,只要它没有在Animal.h
中使用并且使用Treatment类作为指针,编译器不会抱怨Animal类的头文件。但是在Animal.cpp
你正在调用一个来自Treatment类的函数。然后编译器去:
喂!你告诉我要找一个叫做治疗的课程。现在你要我解决这个功能定义,但我没有看到治疗的实现!
因此在Treatment.h
中包含Animal.cpp
的原因。 Animal.cpp将独立于Treatment.cpp编译,反之亦然,因此不应引起我上面提到的冲突。
答案 1 :(得分:1)
由于您在标题中使用了前向声明,因此仍需要在animal.cpp中包含Treatment.h文件
否则,编译器仍然不知道Treatment类是什么。