2017-06-06 4 views
0

私のメッセージが正しくフォーマットされていないことは知っていますが、私は新しいので、とにかく私を助けてください。 私には2つのクラスがあります:父と息子。 Sonにはintとstringがあります。 父には私には息子のオブジェクトのベクトルがあります。 整数で構成されたベクトルの一部、および/または文字列で構成された部分だけにアクセスするにはどうすればよいですか? ありがとうございます!オブジェクトのベクトルをC++で分割する


クラスSON.H

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

class Son 
{ 
    public: 
     Son() {} 
     Son(int first, string second); 
     virtual ~Son(); 
     int getFirst() const; 
     string getSecond() const; 
    private: 
     int _first_parameter; 
     string _second_parameter; 
}; 

#endif // SON_H 

CLASS SON.CPP

#include "son.h" 

Son::Son(int first, string second) 
{ 
    _first_parameter=first; 
    _second_parameter=second; 
} 

Son::~Son() 
{ 
    //dtor 
} 

int Son::getFirst() const 
{ 
    return _first_parameter; 
} 

string Son::getSecond() const 
{ 
    return _second_parameter; 
} 

クラスFATHER.H

#ifndef FATHER_H 
#define FATHER_H 
#include <vector> 
#include "son.h" 

class Father 
{ 
    public: 
     Father() {} 
     virtual ~Father(); 
     void filling(); 
    private: 
     vector<Son> _access_vector; 
     void _printIntegers(vector<int> v); 
     void _printStrings(vector<string> v); 
}; 

#endif // FATHER_H 

CLASSのFATHER.CPP

#include "father.h" 

Father::~Father() 
{ 
    //dtor 
} 

void Father::filling() 
{ 
    int temp_first_param; 
    string temp_second_param; 
    cout<<"Insert integer: "<<endl; 
    cin>>temp_first_param; 
    cout<<"Insert text"<<endl; 
    cin>>temp_second_param; 
    _access_vector.push_back(Son(temp_first_param, temp_second_param)); 
    _printIntegers(_access_vector.getFirst());      /// Here I want to take just the vector of integers 
    _printStrings(_access_vector.getSecond());      /// Here I want to take just the vector of strings 
} 

void Father::_printIntegers(vector<int> v) 
{ 
    for(unsigned i=0; i<v.size(); ++i) 
     cout<<v[i]<<endl; 
} 

void Father::_printStrings(vector<string> v) 
{ 
    for(unsigned i=0; i<v.size(); ++i) 
    { 
     cout<<v[i]<<endl; 
    } 
} 

コンパイルエラー:

||=== Build: Debug in Vector_access_experiment (compiler: GNU GCC Compiler) ===| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp||In member function 'void Father::filling()':| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp|17|error: 'class std::vector' has no member named 'getFirst'| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp|18|error: 'class std::vector' has no member named 'getSecond'| ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

+2

[** std :: vector' **](http://en.cppreference.com/w/cpp/container/vector)で提供されているものと、あなたがしようとしているものそれらのエラーは完璧な意味を持ちます。これらのエラーは、自明でない場合は何もありません。 'std :: vector'に' getFirst'と 'getSecond'メソッドはありません。 – WhozCraig

+1

"整数で構成されたベクトルの一部分"はありませんので、そのようなものにはアクセスできません。 –

+1

'getFirst'と' getSecond'は 'std :: vector'クラスではなく' Son'クラスのメソッドです。そのメソッドにアクセスする前に、オブジェクトをベクターから取得する必要があります。 –

答えて

2

実際の答えはあなたの当面の問題といくつかの説明を解決する方法今、コメントで与えられました。

std :: vectorは配列をラップします。つまり、メモリ内では、ベクトル内のデータは連続しています。 vec [6]はメモリ内のvec [5] + sizeof(type)の位置にあります。あなたのケースでは

、息子以来、店舗の文字列とintが、これはメモリがこのようになっていることを意味します

エントリ0、エントリ0の文字列の長さが、エントリ0の文字列のcharポインタのint型のint型エントリ1、エントリ1の文字列の長さ...

何を取得しようとすると、このようになります構造体です:エントリ0の

int型、エントリ1のint型、...

明らかにそこにはありません。それを作成するとに計算時間を要します。

あなたのメソッドprintIntegersは、(参照しないため)何らかのベクトルをコピーするので、元のベクトルを繰り返して部分データを格納する新しいベクトルを作成するだけで問題を解決できますが、それはデザインが悪いことです。

私が提案したい:

void Father::_printIntegers(const vector<Son>& v) const 
{ 
    for(unsigned i=0; i<v.size(); ++i){ 
     cout<<v[i].getFirst()<<endl; 
    } 
} 

を(参照し、constキーワードによっても追加の呼び出し、それらを使用する!)

ます。また、これかもしれませんが、父内の二つのベクトルを作成し、父に息子をマージすることができいくつかのシナリオで意味をなさない、あなたの文脈に依存します。

あなたのデザインは、Sonが整数と文字列に分離している場合、Sonは弱いクラスかもしれません。クラスは単なるデータ保有者ではありません。最高のことは、息子が印刷自体をすることです。父は息子が何を持っているか知りません - 私が何を意味するのか理解していますか?つまり、状況にもよりますが、場合によっては単なるデータ所有者が必要なものです。

編集:私の答えにはいくつかのコメントは、パラメータを指定せず、ここでの方法を有効なポイントを提起:ベクトルはそのようなを持っていない、あなたがしたいfunction.If:STDがあるため

void Father::_printIntegers() const 
{ 
    for(unsigned i=0; i<v.size(); ++i){ 
     cout<<_access_vector[i].getFirst()<<endl; 
    } 
} 
+0

@ChrisDrew有効なポイントは、私の答えを編集しました。参照とconstパラメータによる呼び出しを説明するために、元のコードも保持しました。 – Aziuth

1

あなたが

_access_vector.getFirst()
_access_vector.getSecond()
を呼び出すことはできませんこの関数を呼び出す、私は たこの

_access_vector.at(i).getFirst(); 
_access_vector.at(i).getSecond(); 

を使うSTDであなたのオブジェクトの位置です::ベクトル

関連する問題