在c ++中拆分对象向量

时间:2017-06-06 08:50:07

标签: c++ c++11 vector

我知道我的信息格式不正确,但我是新手,所以无论如何请帮助我。 我有两个班:父亲和儿子。在Son,我有一个int和一个字符串。 在父亲我有一个儿子对象的向量。 如何只访问由整数和/或由字符串组成的部分组成的向量部分? 非常感谢你!

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:Vector_access_experiment中的调试(编译器:GNU GCC编译器)=== |   C:\ Users \ Alessandro \ Documents \ CodeBlocks \ Vector_access_experiment \ src \ father.cpp ||在成员函数'void Father :: filling()'中:   C:\ Users \ Alessandro \ Documents \ CodeBlocks \ Vector_access_experiment \ src \ father.cpp | 17 |错误:'class std :: vector'没有名为'getFirst'的成员   C:\ Users \ Alessandro \ Documents \ CodeBlocks \ Vector_access_experiment \ src \ father.cpp | 18 | error:'class std :: vector'没有名为'getSecond'的成员   || ===构建失败:2个错误,0个警告(0分钟,0秒(秒))=== |

2 个答案:

答案 0 :(得分:2)

评论中给出了实际答案,现在如何解决您手头的问题和一些解释:

std :: vector包装数组。这意味着,在内存中,向量中的数据是连续的。 vec [6]位于内存中vec [5] + sizeof(type)的位置。

在你的情况下,由于Son存储了一个字符串和一个int,这意味着内存看起来像这样:

条目0的int,条目0的字符串长度,条目0的字符串char指针,条目1的int,条目1的字符串长度...

您尝试获得的结构如下所示:

条目0的int,条目1的int,......

显然不在那里。创建它需要计算时间,没有办法解决这个问题。

由于你的方法printIntegers无论如何都要复制一些向量(因为你没有通过引用调用),你可以通过迭代原始向量创建存储部分数据的新向量来解决这个问题,但这是糟糕的设计。 / p>

我建议:

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

(还通过引用和const关键字添加调用,使用那些!)

你也可以将Son合并到父中,在父中创建两个向量,这在某些情况下可能有意义,取决于你的上下文。

那就是说,至于你的设计 - 如果儿子难以分成整数和弦乐,那么儿子可能是一个弱小的阶级。类不仅仅是数据持有者。最好的事情是Son自己做印刷。父亲应该不知道Son的成员 - 明白我的意思?也就是说,也取决于具体情况,有时仅仅数据持有者就是你想要的。

编辑:对我的回答有些评论提出了一个有效点,这里是没有参数的方法:

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

答案 1 :(得分:1)

你无法调用

_access_vector.getFirst()
_access_vector.getSecond()
因为std:vector没有这样的功能。如果你想调用这个函数,请使用

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

i std :: vector 中对象的位置。