如何在C ++中的两个类之间使用toString和vector?

时间:2011-10-03 11:50:53

标签: c++ visual-c++

  

可能重复:
  Is this possible in C++? toString(ClassName* class)

我正在尝试使用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

2 个答案:

答案 0 :(得分:3)

您应该在Treatment.h中加入Animal.cpp

编辑:要扩展原因,错误消息会转换为:

  

“我看到你宣布了一个叫做治疗的课程。但我没有看到它的实施!”。

因此,为了让编译器在您访问类Treatment成员的位置查看其实现,您需要在#include Treatment.hAnimal.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类是什么。