2012-03-20 3 views
1

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

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

Класс 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++, так как мне это нужно для будущей работы.

EDIT: Обновлен код

+0

Вы используете 'namespace std', а также квалификационный' vector' как 'std :: vector'. Что произойдет, если вы избавитесь от директивы 'use'? –

+1

В качестве примечания: вы должны использовать [список инициализации] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6) в своем конструкторе. –

+0

Держу пари, что это не первая ошибка, так как это не ошибка, и я вижу другие ошибки, которые должен показать первый компилятор. Исправьте первую ошибку (ошибки), и этот будет удален. А именно, ваши включения находятся в неправильных местах. –

ответ

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

EDIT:

Missing класс Классификатор:

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

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

Изменить на:

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

Я думал (altho не был уверен) dogCollection = new std :: vector ; был неправдоподобным, так что это было не в моей «первой» попытке. Я удалил его, но все же дал мне ту же ошибку позже в коде –

+0

Похоже, что у меня было много ошибок.Большое спасибо за ваши указатели! все еще получая ошибку «undefined» на возвращаемом значении в функции getDogs() (которая возвращает вектор). Я редактировал свой пост с изменениями, которые я сделал. Вы видите что-то не так с этим методом или когда im определяет вектор? –

+0

Только что обновленный ответ. – hmjd

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

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

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

1

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

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

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

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

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

Смежные вопросы