2017-06-06 93 views
0

我知道我的消息格式不正確,但是我是新來的,所以請幫助我。 我有兩個班:父親和兒子。在兒子我有一個int和一個字符串。 在父親,我有一個兒子對象的向量。 如何訪問由整數和/或由字符串組成的部分構成的矢量部分? 非常感謝!在C++中拆分對象向量


CLASS 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; 
} 

CLASS 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'是'Son'類的方法,而不是'std :: vector'類的方法。在嘗試訪問其方法之前,您必須從矢量中獲取對象。 –

回答

2

實際的答案在評論中給出,現在如何解決手頭問題並進行一些解釋:

std :: vector包裝數組。這意味着,在存儲器中,矢量內的數據是連續的。 vec [6]位於內存中vec [5] + sizeof(type)的位置。

在你的情況下,由於子存儲串和一個int,這意味着內存看起來像這樣:

條目0,進入0的字符串長度,錄入0的串字符指針的整型INT項1項1的字符串長度...

什麼你試圖得到的是看起來像這樣的結構:

條目0,第1項的整型整型,...

哪顯然不在那裏。創建它需要計算時間,沒有辦法。

既然你的方法printIntegers複製了一些矢量(因爲你不通過引用調用),你可以簡單地通過創建新的矢量來解決這個問題,通過迭代原始矢量來存儲部分數據,但這是不好的設計。

我建議:

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

(!引用和const關鍵字還增加了通話,使用那些)

你也可以合併到兒子的父親,父親內產生兩個向量,這可能在某些情況下有意義,取決於你的情況。

這就是說,至於你的設計 - 如果兒子成爲整數和絃的分離,兒子可能是一個弱班。課程並不意味着僅僅是數據持有者。最好的事情是Son會自己做印刷。父親應該不知道兒子有什麼成員 - 理解我的意思?也就是說,還取決於上下文,有時僅僅是數據持有者就是你想要的。

編輯:我的回答有些意見提出了一個正確的觀點,這裏的方法不帶參數:

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

@ChrisDrew有效點,編輯我的答案。我還保留了原始代碼,以便通過引用和常量參數來說明調用。 – Aziuth

1

不能調用

_access_vector.getFirst()
_access_vector.getSecond()
因爲STD:向量沒有這樣的功能。如果要調用這個函數,使用此

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

STD你的對象的位置::矢量