我搜索了很多这个问题,但没有找到任何内容,如果它重复,请抱歉。
我使用返回 * this 的类方法插入std :: map时遇到问题。如果我尝试插入更多值,则实际只插入第一个值。让我告诉你我的代码:
<?php
ini_set('display_errors', 1);
//sample HTML content
$string1='<html>'
. '<body>'
. '<div>This is div 1</div>'
. '<div class="someclass"> <span class="hot-line-text"> hotline: </span> <a id="hot-line-tel" class="hot-line-link" href="tel:0000" target="_parent"> <button class="hot-line-button"></button> <span class="hot-line-number">0000</span> </a> </div>'
. '</body>'
. '</html>';
$object= new DOMDocument();
$object->loadHTML($string1);
$xpathObj= new DOMXPath($object);
$result=$xpathObj->query('//div[@class="someclass"]');
foreach($result as $node)
{
$node->parentNode->removeChild($node);
}
echo $object->saveHTML();
但是当我尝试这样的事情时:
using namespace std;
class test{
public:
test(){}
test Add(const int &a, const int &b);
void print(){
for (auto it = map1.begin(); it != map1.end(); ++it) {
cout << it->first << " " << it->second << endl;
}
}
private:
map<int,int> map1;
};
test test::Add(const int &a, const int &b) {
map1.insert(make_pair(a,b));
return *this;
}
只有第一个值插入到地图中。我应该更改以这种方式插入地图?
非常感谢你的帮助。
答案 0 :(得分:0)
你的错误是那个
test Add(const int &a, const int &b);
按值返回。这意味着从test
返回的Add
与您调用它的test
不同,它是一个副本。这意味着当您执行类似
a.Add(1,5) . Add( 4, 8);
. Add( 4, 8)
部分会将该项目添加到a
而非a
本身的副本中。
解决这个问题的方法是通过引用而不是值返回。当您通过引用返回时,您将使用您调用add
的项目而不是副本。这意味着您只需要将函数签名更改为
test& Add(const int &a, const int &b)
对于声明和定义。
答案 1 :(得分:0)
您插入一次的原因是因为您的Add
方法按值返回,而您的第二个. Add( 4, 8);
最终会插入到另一个地图中。要解决此问题,您需要更改Add
以返回对*this
的引用:
using namespace std;
class test
{
public:
test() {}
test& Add(const int &a, const int &b); // < -- changed to return test&
void print() {
for (auto it = map1.begin(); it != map1.end(); ++it) {
cout << it->first << " " << it->second << endl;
}
}
private:
map<int, int> map1;
};
test& test::Add(const int &a, const int &b) // < -- changed to return test&
{
map1.insert(make_pair(a, b));
return *this;
}
Output of your program with the fix变为:
1 5
4 8
答案 2 :(得分:0)
问题是您的Add
函数正在返回当前对象的副本。要返回当前对象本身,您需要将返回类型更改为引用:
test & test::Add(const int &a, const int &b) {
// ^^^^^
map1.insert(make_pair(a,b));
return *this;
}
您当前的代码将第二个Add
应用于与应用第一个Add
的对象不同的对象,因此您永远不会看到效果。然而,对于笑声和咯咯笑声,你也可以尝试:
a.Add(1,5) . Add( 4, 8) . print();