BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #78490同步于 2014/4/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]关于C++中链表和template,添加类后,变量无法改值的问题

liangzulin
2014/4/17镜像同步5 回复
原先学过java,觉得java里的ArrayList很好用 现在由于毕设的关系临时学了学C++ 想设计一个类似ArrayList的类 然后设计了一个Pdata类,Pdata类中有一私有变量data 运用设计好的add方法向ArrayList里添加2个Pdata类,构造后的data数值分别是3和5 然后对ArrayList进行历遍,运用Pdata的add方法将每一个Pdata的data变量都加1 现在问题来了,类中方法打印出来的数值是已经相加的,但却并没有写入到data中 这是为什么呢? 源代码: #include <iostream> using namespace std; template<typename T> class Node2{ public: T element; Node2<T> *next; Node2(){ next=NULL; }; Node2(T element){ this->element=element; }; }; template<typename T> class ArrayList{ private: Node2<T> *head,*tail; int size; public: ArrayList(); void add(T element); void removeLast(); void removeAll(); T get(int index); int getSize(); }; //======================================= template<typename T> ArrayList<T>::ArrayList(){ }; template<typename T> void ArrayList<T>::add(T element){ if(tail==NULL){ head=tail=new Node2<T>(element); }else{ tail->next=new Node2<T>(element); tail=tail->next; } size++; }; template<typename T> void ArrayList<T>::removeLast(){ if(size==0){ cout<<"No elements in the list"<<endl; }else if(size==1){ Node2<T> *temp=head; head=tail=NULL; size=0; T element=temp->element; delete temp; }else{ Node2<T> *current=head; for(int i=0;i<size-2;i++) current=current->next; Node2<T> *temp=tail; tail=current; tail->next=NULL; size--; T element=temp->element; delete temp; } } template<typename T> void ArrayList<T>::removeAll(){ while (size!=0){ removeLast(); } } template<typename T> T ArrayList<T>::get(int index){ Node2<T> *current=head; for(int i=0;i<index;i++) current=current->next; return current->element; }; template<typename T> int ArrayList<T>::getSize(){ return size; }; //================================= class Pdata{ private: int data; public: Pdata(){ data=0; } Pdata(int x){ data=x; } void add(int x){ data+=x; cout<<"data="<<data<<endl; } int get(){ return data; } void set(int x){ data=x; } }; //===================================== ArrayList<Pdata> scene; //main int main(int argc, char *argv[]) { Pdata abc(3),def(5); scene.add(abc); scene.add(def); abc.add(1); for(int i=0;i<scene.getSize();i++){ scene.get(i).add(3); } for(int i=0;i<scene.getSize();i++){ cout<<"getsence("<<i<<")="<<scene.get(i).get()<<endl; } cout<<"abc="<<abc.get()<<endl; system("PAUSE"); return EXIT_SUCCESS; } 打印结果: data=4 data=6 data=8 getsence(0)=3 getsence(1)=5 abc=4 请按任意键继续。。。 问题就是,为什么getsence(0)不等于6而等于3? getsence(1)不等于8而等于5?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
liangzulin机器人#1 · 2014/4/17
补充:而没有导入链表里的Pdata类实例abc的数值却能在add后改变,导入链表里的Pdata类在运用了Pdata中的add方法后却没有改变其内部data数值
nuanyangyang机器人#2 · 2014/4/17
C++有vector,应该是最接近ArrayList的了吧。 另外,ArrayList下面是数组,不是链表。Java对应的链表是LinkedList。C++对应的是list。
nuanyangyang机器人#3 · 2014/4/17
其实,根本问题在于,C++里的类类型的变量都是按值拷贝的(如果不是指针的话)。所以,你先get再add,其实是先拷贝一份,再把拷贝出来的变化了,而列表里的原件并没有改变。
liangzulin机器人#4 · 2014/4/17
恩,非常感谢。 【 在 nuanyangyang 的大作中提到: 】 : 其实,根本问题在于,C++里的类类型的变量都是按值拷贝的(如果不是指针的话)。所以,你先get再add,其实是先拷贝一份,再把拷贝出来的变化了,而列表里的原件并没有改变。
gsl2011机器人#5 · 2014/4/18
太长没看, get个引用出来可以解决吧 来自「北邮人论坛手机版」