在自定义类中定义向量

时间:2012-03-20 14:50:02

标签: c++ class visual-c++ vector c-preprocessor

我试图在我的一个班级中使用一个向量。在尝试访问该向量时,它告诉我它未定义(但我已经在我的标题中定义了它)。

我有两个班,人和狗。一个人可以拥有一只或多只狗,所以我想将一个人拥有的每只狗添加到一个阵列中。这应该是非常简单的,所以这个问题真的开始转向我。这是一些代码:

Person.cpp类:

#include "Person.h"
#include "stdafx.h"
#include <iostream>

using namespace std;

Person::Person(string name, string address, int age)
    :name(name),
    address(address),
    age(age)
    {}
int Person::getAge(){
    return age;
}
std::string Person::getDogInfo(int index){
}
void Person::addDog(string dogName, string breed){
    dogCollection.push_back(Dog(dogName, breed));
}
std::vector<Dog> getDogs(){
    return dogCollection;  //dogCollection undefined error here
}

这是Person.h:

#ifndef Person_H
#define Person_H
#include <vector>
#include "Dog.h"
using namespace std;
class Person{
    public:
        Person(string name, string address, int age);
        string getName(){return name};
        string getAddress(){return address};
        void addDog(string dogName, string breed);
        string getDogInfo(int index);
        std::vector<Dog> getDogs();
        int getAge();

    private:
        string name;
        string address;
        int age;
        std::vector<Dog> dogCollection;
};
#endif

如果您想查看我的狗课程,我也会粘贴它们:

Dog.cpp:

#include "stdafx.h"
#include <iostream>
#include "dog.h"

Dog::Dog(string dogName, string breed)
    :dogName(dogName),
        breed(breed){}

std::string Dog::Dog.getDogName(){
return dogName;
}

std::string Dog::Dog.getBreed(){
return breed;
}

和Dog.h:

#ifndef Dog_H
#define Dog_H
#include <iostream>
using namespace std;

class Dog{
public:
    Dog(std::string dogName, std::string breed);
    std::string getDogName();
    std::string getBreed();
private:
    std::string dogName;
    std::string breed;
};
#endif

另外,我只想补充一点,这不是作业。我已经习惯了java,而我只是想学习一些C ++,因为我需要它来用于未来的工作。

编辑:更新了代码

3 个答案:

答案 0 :(得分:2)

    std::vector<Dog> dogCollection;  // here im defining dogCollection, no error here! 

实际上 是一个问题 - 此时编译器不知道类Dog

您可以通过Dog.h Person.h之前的Person.cpp或{strong>更好添加#include "Dog.h"来解决此问题。{{ 1}}。

答案 1 :(得分:1)

这是不正确的(并且不需要):

dogCollection = new std::vector<Dog>; // Remove this line.

由于dogCollection不是std::vector<Dog>*


这也是错误的:

void Person::addDog(string dogName, string breed){
    Dog *newDog = new Dog(dogName, breed);
    dogCollection.push_back(newDog);
}

由于dogCollection包含Dog个实例,而不是Dog*。改为:

void Person::addDog(string dogName, string breed){
    dogCollection.push_back(Dog(dogName, breed));
}

所有构造函数都存在问题:

Person::Person(string name, string address, int age){
    name=name;
    address=address;
    age=age;
}

这是将参数name分配给自己:它没有分配给成员name。对于addressage也是如此,对于其他类的构造函数也是如此。使用初始化列表:

Person::Person(string name, string address, int age) :
    name(name),
    address(address),
    age(age)
{}

此方法不会返回std::string

string Person::getDogInfo(int index){
}

编辑:

缺少课程资格:

std::vector<Dog> getDogs(){
    return dogCollection;  //dogCollection undefined error here
}

表示这只是一个自由函数,与Person类无关,因此无法访问dogCollection

更改为:

std::vector<Dog> Person::getDogs(){
    return dogCollection;
}

答案 2 :(得分:1)

您的代码存在一些问题,大多数其他答案都指出了这些问题 - 主要是关于new在不应该使用时的问题。 (你是C#程序员,转向C ++吗?)

但是,#include指令也存在问题。正如@Bo所提到的,由于Person使用Dog,您应该在Person.h中包含该标头。但Person也使用vector,因此标题也应包含在其中。所以Person.h应该以......开头。

#include <vector>
#include "Dog.h"

然后在Person.cpp中,您不必包含这些文件。

作为一般规则(您可以稍后了解“前向声明”),标题中引用的任何类型都应该在该标题中为#include d。