我试图在我的一个班级中使用一个向量。在尝试访问该向量时,它告诉我它未定义(但我已经在我的标题中定义了它)。
我有两个班,人和狗。一个人可以拥有一只或多只狗,所以我想将一个人拥有的每只狗添加到一个阵列中。这应该是非常简单的,所以这个问题真的开始转向我。这是一些代码:
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 ++,因为我需要它来用于未来的工作。
编辑:更新了代码
答案 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
。对于address
和age
也是如此,对于其他类的构造函数也是如此。使用初始化列表:
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。