C++ 新手求助我按应用传递仿函数,而调用结果却像是按值传递,望高手指点啊
/*我通过passed-by-reference传递仿函数,如下*generate_n<back_insert_iterator<list<int>>,*int,IntS...
/* 我通过passed-by-reference传递仿函数,如下
* generate_n<back_insert_iterator<list<int> >,
* int, IntSequence&>(back_inserter(coll),
* 但是对象seq的数据value却没有改变这是怎么回事
* 望高手指正
* PRINT_ELEMENT()函数是我编写用来打印所有容器元素
*/
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include "Print.h"
using namespace std;
class IntSequence {
private:
int value;
public:
IntSequence(int initialValue)
: value(initialValue) {}
int get_value(){
return value; }
int operator() () {
return value++;
}
};
int main()
{
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >,
int, IntSequence&>(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
IntSequence(42));
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
}
// print头文件的源代码
// print.h
#ifndef PRINT_H
#define PRINT_H
#include <iostream>
template<typename T>
inline void PRINT_ELEMENTS(T CONT)
{
typename T::const_iterator pos;
typename T::const_iterator end(CONT.end());
for(pos = CONT.begin(); pos!=end; ++pos) {
std::cout << *pos << ' '; }
std::cout << std::endl;
}
#endif
/* 应该显示这样的结果啊
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 5 6 7 8
* 1 2 3 4 42 43 44 45 5 6 7 8 5 6 7 8
*/
/* 可我得到的结果却是这样的
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 1 2 3 4
* 1 2 3 4 42 43 44 45 1 2 3 4 1 2 3 4
*/ 展开
* generate_n<back_insert_iterator<list<int> >,
* int, IntSequence&>(back_inserter(coll),
* 但是对象seq的数据value却没有改变这是怎么回事
* 望高手指正
* PRINT_ELEMENT()函数是我编写用来打印所有容器元素
*/
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include "Print.h"
using namespace std;
class IntSequence {
private:
int value;
public:
IntSequence(int initialValue)
: value(initialValue) {}
int get_value(){
return value; }
int operator() () {
return value++;
}
};
int main()
{
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >,
int, IntSequence&>(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
IntSequence(42));
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);
}
// print头文件的源代码
// print.h
#ifndef PRINT_H
#define PRINT_H
#include <iostream>
template<typename T>
inline void PRINT_ELEMENTS(T CONT)
{
typename T::const_iterator pos;
typename T::const_iterator end(CONT.end());
for(pos = CONT.begin(); pos!=end; ++pos) {
std::cout << *pos << ' '; }
std::cout << std::endl;
}
#endif
/* 应该显示这样的结果啊
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 5 6 7 8
* 1 2 3 4 42 43 44 45 5 6 7 8 5 6 7 8
*/
/* 可我得到的结果却是这样的
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 1 2 3 4
* 1 2 3 4 42 43 44 45 1 2 3 4 1 2 3 4
*/ 展开
展开全部
seq一直没变,所以始终输出1 2 3 4
int main()
{
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >, int, IntSequence&>(back_inserter(coll), 4, seq); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, IntSequence(42)); PRINT_ELEMENTS(coll);
IntSequence seq1(5); // 加上这句
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
return 0;
}
int main()
{
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >, int, IntSequence&>(back_inserter(coll), 4, seq); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, IntSequence(42)); PRINT_ELEMENTS(coll);
IntSequence seq1(5); // 加上这句
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
return 0;
}
追问
嗯,我的意思再不加 IntSequence seq1(5); 这条代码的情况下实现
麻烦你看下我的这条代码
generate_n >,
int, IntSequence&>(back_inserter(coll),
4,
seq);
其中intSequence&>这儿不是按值传递,而是按引用传递(&有取址符)按引用传递调用函数是有副作用的,所以这儿seq应该改变了状态(seq的数据value从1变成了5),为什么seq一直没变呢
追答
我用vc++2010跟进generate_n
template inline
void generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
{ // replace [_Dest, _Dest + _Count) with _Func()
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Func);
_Generate_n(_Dest, _Count, _Func,
_Is_checked(_Dest));
}
当调用_Generate_n时,模板会将引用类型转换为实际类,所以此时的_Func已经是seq通过拷贝构造函数生成的新的对象._Generate_n源码如下:
template inline
void _Generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func,
_STD tr1::true_type)
{ // replace [_Dest, _Dest + _Count) with _Func(), checked dest
_Generate_n1(_Dest, _Count, _Func,
_Iter_cat(_Dest));
}
在这里已经是按值传参了.所以generate_n执行完后seq不变.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询