【问题标题】:Splitting a vector of objects in c++在 C++ 中拆分对象向量
【发布时间】:2017-06-06 08:50:07
【问题描述】:

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


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

类父亲.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

类父亲.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;
    }
}

编译器错误:

||=== 构建:在 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|错误:'class std::vector' 没有名为'getSecond'的成员| ||=== 构建失败:2 个错误,0 个警告(0 分钟,0 秒)===|

【问题讨论】:

  • 查看std::vector 提供的 与您尝试使用它执行的操作,这些错误非常有意义。这些错误如果不是不言自明的,那也算不了什么。 std::vector 中没有 getFirstgetSecond 方法。
  • 没有“只是由整数组成的向量部分”,所以你不能访问任何这样的东西。
  • getFirstgetSecondSon 类的方法,而不是 std::vector 类的方法。在尝试访问其方法之前,您必须从向量中获取对象。

标签: c++ c++11 vector


【解决方案1】:

实际答案已在 cmets 中给出,现在如何解决您手头的问题以及一些解释:

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

在你的例子中,由于 Son 存储一个字符串和一个 int,这意味着内存看起来像这样:

条目 0 的整数,条目 0 的字符串长度,条目 0 的字符串 char 指针,条目 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 合并到 Father,在父亲中创建两个向量,这在某些情况下可能有意义,具体取决于您的上下文。

也就是说,至于您的设计 - 如果将 Son 硬分离为整数和字符串,则 Son 可能是一个弱类。类不只是数据持有者。最好的事情是儿子自己做印刷。父亲不应该知道儿子有什么成员——明白我的意思吗?也就是说,也取决于上下文,有时您想要的只是数据持有者。

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

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

【讨论】:

  • @ChrisDrew 有效点,编辑了我的答案。我还保留了原始代码,以说明通过引用和 const 参数调用。
【解决方案2】:

你不能打电话

_access_vector.getFirst()
_access_vector.getSecond()
因为std:vector没有这个函数。如果你想调用这个函数,使用这个
_access_vector.at(i).getFirst();
_access_vector.at(i).getSecond();

i 是你的对象在 std::vector 中的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2013-07-10
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多