Определение вектора в пользовательском классе - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь просто использовать вектор в одном из моих классов. При попытке получить доступ к вектору он сообщает, что он не определен (но я определил его в своем заголовке).

У меня есть два класса, Персона и Собака. У человека может быть одна или несколько собак, поэтому я хочу добавить каждую собаку, которой владеет человек, в массив. Это должно быть очень просто, поэтому эта проблема действительно начинает доходить до меня. Вот некоторый код:

Класс 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 ]

2 голосов
/ 20 марта 2012
    std::vector<Dog> dogCollection;  // here im defining dogCollection, no error here! 

На самом деле - это проблема здесь - класс Dog не известен компилятору на данный момент.

Вы можете решить эту проблему, включив Dog.h перед Person.h в Person.cpp, или лучше добавив #include "Dog.h" вверху Person.h.

1 голос
/ 20 марта 2012

Есть несколько проблем с вашим кодом, и большинство других ответов указали на них - в основном это касается использования new, когда его не следует использовать. (Вы программист на C #, переходите на C ++?)

Однако существуют проблемы и с директивами #include. Как уже упоминалось @Bo, поскольку Person использует Dog, вы должны включить этот заголовок в Person.h. Но Person также использует vector, поэтому заголовок также должен быть там включен. Так что Person.h должно начинаться с ...

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

Тогда в Person.cpp вам не нужно включать эти файлы.

Как общее правило (о «предварительном объявлении» можно узнать позже), любые типы, на которые есть ссылки в заголовке, должны быть #include d в этом заголовке.

1 голос
/ 20 марта 2012

Это неверно (и не требуется):

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){
}

EDIT:

Квалификатор отсутствующего класса:

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

означает, что это просто бесплатная функция, без связи с классом Person и, следовательно, без доступа к dogCollection.

Изменить на:

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