返回信息流原先学过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?
这是一条镜像帖。来源:北邮人论坛 / cpp / #78490同步于 2014/4/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]关于C++中链表和template,添加类后,变量无法改值的问题
liangzulin
2014/4/17镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
补充:而没有导入链表里的Pdata类实例abc的数值却能在add后改变,导入链表里的Pdata类在运用了Pdata中的add方法后却没有改变其内部data数值
C++有vector,应该是最接近ArrayList的了吧。
另外,ArrayList下面是数组,不是链表。Java对应的链表是LinkedList。C++对应的是list。
其实,根本问题在于,C++里的类类型的变量都是按值拷贝的(如果不是指针的话)。所以,你先get再add,其实是先拷贝一份,再把拷贝出来的变化了,而列表里的原件并没有改变。
恩,非常感谢。
【 在 nuanyangyang 的大作中提到: 】
: 其实,根本问题在于,C++里的类类型的变量都是按值拷贝的(如果不是指针的话)。所以,你先get再add,其实是先拷贝一份,再把拷贝出来的变化了,而列表里的原件并没有改变。