2012-03-20 4 views
1

私は自分のクラスの中で単にベクターを使用しようとしています。ベクトルにアクセスしようとすると、定義されていないことがわかります(ただし、ヘッダーに定義しています)。カスタムクラス内にベクターを定義する

私はPersonとDogという2つのクラスを持っています。 1つの人が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'として修飾しています。 'using'指示文を取り除くとどうなりますか? –

+1

サイドノートとして:コンストラクタで[初期化リスト](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6)を使用する必要があります。 –

+0

私はそれがエラーではないので、最初のエラーではないと賭けて、私はコンパイラが最初に表示される他のエラーを参照してください。最初のエラーを修正してください。このエラーは消えてしまいます。つまり、あなたのインクルードは間違った場所にあります。 –

答えて

1

これは正しくない(および不要)である:dogCollectionとして

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

std::vector<Dog>*ありません。


また、これは誤りです。dogCollectionとして

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

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 
} 

が、これは単にであることを意味フリーe関数であり、クラスPersonに関連付けられていないため、dogCollectionへのアクセス権はありません。

変更するには:

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

dogCollection = new std :: vector と思った(althoはわからなかった)。私の "最初の"試みではなかったので、変わっていませんでした。私はそれを削除したが、私はまだコードの後に​​同じエラーを与える –

+0

私は多くのエラーがあったようだ。あなたの指針をありがとう!関数getDogs()(ベクトルを返す)の戻り値の "未定義"エラーがまだ返っています。私は変更を加えて投稿を編集しました。そのmetodに何か間違っているのを見たり、ベクトルを定義したりすることができますか? –

+0

ちょうど答えが更新されました。 – hmjd

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

実際がここでの問題あり - クラスDogは、この時点でコンパイラに知られていません。あなたはPerson.cppPerson.hDog.h、またはより良いを含むいずれかの方法でこの問題を解決することができます

Person.hの上部に#include "Dog.h"を追加します。

1

あなたのコードにはいくつかの問題があります。他の回答の多くは、主にnewを使用しないことを指摘しています。 (あなたはC#プログラマで、C++に移行していますか?)

しかし、#includeディレクティブにも問題があります。上記の通り、PersonDogを使用しているため、そのヘッダーはPerson.hに含める必要があります。しかしPersonvectorを使用するので、ヘッダーもそこに含めてください。だから、Person.hはその後Person.cppにあなたがそれらのファイルを含める必要はありません

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

...で始まる必要があります。

一般的な規則(後で「前方宣言」について学ぶことができます)では、ヘッダーで参照されるすべての型は、そのヘッダー内で#includeです。

関連する問題