C ++指针不更新值

时间:2015-11-18 14:27:39

标签: c++ pointers

//Inside the header.h

class telefonbok{
    std::map<std::string,std::string> telebok;
    std::map<std::string,std::string> aliasbok;
}
//Inside the cpp file
void telefonbok::alias(string name, string alias){
if (telebok.find(name) == telebok.end()) {

    cout << "Not found" << endl;

} else {

    //pointer = Adress stored in pointer.
    //*pointer = Value of *pointer

    string *pointer;
    pointer = &telebok.find(name)->second;
    aliasbok.insert(make_pair(alias, *pointer));
    cout << *pointer << endl;

}

当我更改第一个地图(telebok)中的值时,地图中的第二个值(aliasbok)保持不变(应该将指针作为值的那个)。

例:
添加彼得123
查找彼得:
彼得:123
别名peter pete
查找皮特:
皮特:123
改变彼得987
查找彼得:
彼得:987
查找皮特:
皮特:123

(皮特永远不会改变这个问题,它应该总是与皮特有相同的价值)

3 个答案:

答案 0 :(得分:0)

您必须存储共享指针并将它们适当地设置为相同的字符串。

class telefonbok{
std::map<std::string,std::shared_ptr<std::string>> telebok;
std::map<std::string,std::shared_ptr<std::string>> aliasbok;
}

并提供根据需要更新指针的方法,例如

void addphone(std::string const & name, 
   std::string const & alias, 
   std::string const & phone);
{
  std::shared_ptr<std::string> phone_ptr(new std::string(phone));
  telefonbok.telebok.emplace(name,phone_ptr);
  telefonbok.aliasbok.emplace(alias,phone_ptr);
}

这样当你修改手机时,它会在两者上都得到更新。退出功能范围时,手机也不会死亡。

然后你可以这样做更新

void update_phone(std::string const & name, 
                  std::string const & newphone)
{
  if( auto iter = telefonbok.telebok.find(name) )
  {
     *(iter->second.get()) = newphone;
  } else if ( auto iter = telefonbok.aliasbok.find(name) )
  { 
      *(iter->second.get()) = newphone;
  }
}

答案 1 :(得分:0)

  

当我更改第一个地图(telebok)中的值时,地图中的第二个值(aliasbok)保持不变(应该将指针作为值)。< / p>

如果aliasbok应该有指针作为值,那么你的错误就是你错误地定义了地图。这是你的定义:

std::map<std::string,std::string> aliasbok;

注意地图的值类型std::string是一种值类型,而不是std::string*这是一种指针类型。

还要注意这一行:

aliasbok.insert(make_pair(alias, *pointer));

取消引用指针并将指向的字符串复制到对中,而不是复制指针。

答案 2 :(得分:0)

首先你的代码是低效的(你调用find两次,这是非常昂贵的操作),所以你应该使用迭代器,而不是指针,它也将有助于解决你的问题:

class telefonbok{
    typedef std::map<std::string,std::string> Telebok;
    typedef std::map<std::string,Telebok::const_iterator> Aliasbok;

    Telebok telebok;
    Aliasbok aliasbok;
};

void telefonbok::alias(string name, string alias)
{
    Telebok::const_iterator f = telebok.find( name );
    if( f == telebok.end() ) 
        cout << "Not found" << endl;
    else
        aliasbok.insert( make_pair( alias, f );
}

现在你有以下内容:

  • 您没有两次致电std::map::find()
  • 通过别名,您不仅可以找到号码,还可以找到原始名称

从别名代码打印值有点复杂:

   for( Aliasbok::const_iterator it = aliasbok.begin(); it != aliasbok.end(); ++it )
       cout << "alias " << it->first << " has number " << it->second->second << " original name " << it->second->first << endl;

或找到一个值:

  Aliasbok::const_iterator it = aliasbok.find( "abcd" );
  if( it != aliasbok.end() )
      cout << "phone for " << it->first << " is " << it->second->second << endl;
  else
      cout << "phone for abcd not found" << endl;

但是在使用迭代器时应该习惯它

注意:如果从电话簿中删除记录,则需要先清理别名,否则它将保留无效的迭代器。正确的解决方案是使用boost::multi_index,但这可能对您的级别来说太复杂了。