当前位置: 首页 > 知识库问答 >
问题:

如何在C++中从map的迭代器调用类成员函数?

穆城
2023-03-14

我无法使用Map的迭代器调用show函数。有没有办法使用迭代器做到这一点?

#include <iostream>
#include <string>
#include <map>
using namespace std;
class A 
{ 
    int i;
    public: 
    A(int pi):i(pi)   {  cout<<"A()\n"; }
    void show() const { cout<<i<<endl; }
    ~A()   {  cout<<"~A()\n"; }
};
int main()
{
    map<char, A > mymap;
    A a(9) , b(8) , c(7);
    mymap['a'] =  a;
    mymap['b'] =  b;
    mymap['c'] =  c;
    map<char,A >::iterator it;
    for(it = mymap.begin(); it != mymap.end() ; it++)
        (*(it->second)).show();
    return 0;
}

在使用it->second.show()时,我得到以下错误:

在文件中包含了/usr/include/C++/4.9/bits/stl_map。h:63:0,/usr/include/C++/4.9/map:61,3:/usr/include/C++/4.9/tuple:在“std::pair<_t1,_t2>::pair”的实例化中(std::tuple<_args1....>&,std::_index_tuple<_args2....>,std::_index_tuple<_indexes1....>,std::_index_tuple<_indexes2....>)[with_args1={char};长construct_helper<_TP,_args>::type>std::allocator_traits<_alloc>::_s_construct_t&,_tp*,_args&...)[with_tp=std::pair;_args={const std::piecewise_construct_t&,std::tuple,std::tuple<>};_alloc=std::allocator>>;std::_require::__construct_helper<_TP,_args>::type>=void]“std::allocator_traits<_alloc>::construct(_alloc&,_tp*,_args&...)[with_tp=std::piecewise_construct_t&,std::tuple,std::tuple<>};_alloc=std::allocator>>;decltype(_s_construct(__a,__p,(forward<_args>)(std::allocator_traits::construct::__args)...)=]'Compare,_alloc>::const_iterator,_args&...)[with_args={const std::piecewise_construct_t&,std::tuple,std::tuple<>};_key=char;_val=std::pair;_keyofvalue=std::_selectlast>;_Compare=std::allocator>;std::_rb_tree<_key,_val,_keyofvalue,_Compare,_alloc>::iterator=std::_rb_tree_iterator>;__tuple2))...)^/usr/include/C++/4.9/tuple:1104:70:注意:候选项为:9:5:注意:a::a(int)9:5:注意:候选项需要1个参数,提供0 5:7:注意:constexpr a::a(const a&)5:7:注意:候选项需要1个参数,提供0

共有3个答案

舒浩邈
2023-03-14

这样怎么样?朋友。

#include <iostream>
#include <string>
#include <map>
using namespace std;
class A 
{ 
    int i;
public: 
    A(int pi=0):i(pi)   {  cout<<"A()\n"; }
    void show() const { cout<<i<<endl; }
    ~A()   {  cout<<"~A()\n"; }
};

int main()
{
    map<char, A > mymap;
    A a(9) , b(8) , c(7);
    mymap['a'] =  a;
    mymap['b'] =  b;
    mymap['c'] =  c;
    map<char,A >::iterator it;
    for(it = mymap.begin(); it != mymap.end() ; it++)
        it->second.show();
    return 0;
}
鞠乐
2023-03-14

属性中需要一个默认构造函数:

A() {}

编译器将不会创建默认构造函数,如果您提供了任何其他C-函数。

第二件事是如何调用函数:

it->second.show();
终子昂
2023-03-14

1.it->second将直接返回A,而不是A*,您应该更改

(*(it->second)).show();

(it->second).show();

2.std::map::operator[]需要类型A为DefaultConstructable。

如果键不存在,则插入value_type(key,T())。

但是a没有默认构造函数,您可以

mymap.insert({'a', a});

或者正如@jarod42建议的:

mymap.emplace('a', a);

以避免默认构造A

 类似资料:
  • C++ 类 & 对象 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。 让我们看看之前定义的类 Box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员: class Box { public: double length; // 长度

  • 我正在尝试创建一个21点模拟器。在向玩家和庄家发牌之前,我需要洗牌。是一个无效函数,是类中的卡类型。职业存储从职业中发出的牌。在游戏开始时,我需要向玩家和庄家发两张牌。当我尝试在类访问 的成员函数时,我收到错误消息“调用不带对象参数的非静态成员函数”。调用成员函数的正确方法是什么?我真的对语法感到困惑。

  • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

  • 我仍然试图掌握抽象基类的概念,以及从派生类中可以做什么和不能做什么。 我有以下代码: 基类中的示例- 在派生类中

  • 问题内容: 我有一个C函数,我想从C 调用。我无法使用“ ”这样的方法,因为C函数无法使用g 进行编译。但是使用gcc可以很好地编译。有什么想法如何从C ++调用函数吗? 问题答案: 像这样编译C代码: 然后是这样的C ++代码: 然后使用C ++链接器将它们链接在一起: 当您包含C函数的声明时,还必须告诉C ++编译器C头即将到来。因此开始于: 应该包含以下内容: (在此示例中,我使用了gcc,

  • 我有一个映射,它包含日期作为键和(另一个字符串作为键和列表作为值的映射)作为值。,我想填充另一个将String作为键和double作为值的映射。FlexiServer的内容包括 因此,基本上,我想首先迭代外部映射以获得内部映射,然后迭代内部映射以获得FlexiServers列表,并填充新的映射,其中服务器号作为键,数量列表作为值。我如何使用Java8流来实现这一点呢? 我尝试使用for循环,但我希