游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3434|回复: 9

求助:关于C++模板问题

[复制链接]

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2006-3-2 11:34:00 | 显示全部楼层 |阅读模式
  偶实在不好意思在这里求助各位~~但是昨天晚上把这个程序(见下)看了无数遍~~调试来调试去~~觉得实在找不出错误~~也以为自己对模板理解有错误,如果有,还请大家告诉我我在哪里理解错了没,小弟拜谢了----主要这里看上去象是模板嵌套~~逼不得以才来求助大家~~
/////template.h
#include <iostream>
using namespace std;

template <class Type>
class Node
{
    private:
        Type    m_Data;
    public:
        Node()        {     m_Data=0;   }
        void    Set_m_Data(Type param);
        Type    Get_m_Data();
};

template <class Type>
Type    Node<Type>::Get_m_Data()
{
        cout <<"Now in the Get_m_Data m_Data=" <<m_Data<<endl;
    return m_Data;
}
template <class Type>
void  Node <Type> ::Set_m_Data(Type param)
{
        cout << "Set_m_Data was called and param=" <<param <<endl;
    m_Data=param;
        cout <<"now in the Set_m_Data and m_Data=" <<m_Data <<endl;
}


/////////////////////////////////
template <class Type>

class LinkedList
{
    private:
        Node <Type> m_Node;
    public:
        LinkedList():m_Node(){}
        void Show_m_Node();
        Node <Type> Get_m_Node();
};

template <class Type>

void LinkedList<Type>::Show_m_Node()
{
        Type a=m_Node.Get_m_Data();
    cout << a << endl;
   
}

template <class T>
Node <T>   LinkedList <T>::Get_m_Node()
{
    return m_Node;
}
      
//////////////////
///main.cpp
#include <iostream>
#include <stdlib.h>
#include "template.h"
int main(int argc, char *argv[])
{
  LinkedList <int> a;
  
  a.Get_m_Node().Set_m_Data(1120);
  
  a.Show_m_Node();
  
  system(&quotAUSE");       
  return 0;
}


执行结果异常郁闷:--本以为m_Data会等于1120----但是结果却等于0!
Dev-C++和VC6下均相同~~
sf_200632113416.jpg

5

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
QQ
发表于 2006-3-2 12:59:00 | 显示全部楼层

Re:求助:关于C++模板问题

问题出在
template <class T>
Node <T>   LinkedList <T>::Get_m_Node()
{
    return m_Node;
}

应该改成
template <class T>
Node<T>&   LinkedList <T>::Get_m_Node()
{
    return m_Node;
}

你应该知道为什么这么改吧!

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-2 13:28:00 | 显示全部楼层

Re:求助:关于C++模板问题

~~~谢谢了~~我看到楼上的回帖~简直是当头一棒的震惊~~原来我是让它返回了一个对象~~而他改了后~就是返回原来对象的引用---相当于返回了对象本身--这么看来~我原来做的相当于是返回了一个对象的复制~~既然是复制~那又为什么不把其私有成员变量的值也复制了呢?
  不知道这样理解对不对~~?

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2006-3-2 14:36:00 | 显示全部楼层

Re:求助:关于C++模板问题

你那个Show_m_Node()里边的Get方法里也是复制

11

主题

162

帖子

189

积分

注册会员

Rank: 2

积分
189
QQ
发表于 2006-3-2 16:01:00 | 显示全部楼层

Re:求助:关于C++模板问题

"~~~谢谢了~~我看到楼上的回帖~简直是当头一棒的震惊~~原来我是让它返回了一个对象~~而他改了后~就是返回原来对象的引用---相当于返回了对象本身--这么看来~我原来做的相当于是返回了一个对象的复制~~既然是复制~那又为什么不把其私有成员变量的值也复制了呢?
  不知道这样理解对不对~~?"

这个应该是在这里:

  a.Get_m_Node().Set_m_Data(1120);

如果不改的话,这条语句根本没有修改 a 中的任何内容, 而只是修改了 a 的一个复制。

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-2 17:24:00 | 显示全部楼层

Re: Re:求助:关于C++模板问题

游戏战士: Re:求助:关于C++模板问题

你那个Show_m_Node()里边的Get方法里也是复制


当然是复制啊~~但是在这里即使是复制也不重要嘛~因为我只需要一个复制~我又不打算改变它~~而且在这里我也不是怕返回一个复制~---对于类---对象~~我的意思是说~~如果返回一个对象-----(一个拥有自己的私有数据成员但是函数与其他相同类的对象共享-)-----的复制,为什么在这个例子里看上去并没有复制其成员变量?

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-3-2 21:56:00 | 显示全部楼层

Re:求助:关于C++模板问题

这种复制没有问题,因为是基本类型,值传递赋值也没有问题,返回虽然是产生一个新的对象,但也会进行拷贝构造,只是我觉得奇怪的是,你得node里的函数打印的信息没有打印出来!!!

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-2 22:28:00 | 显示全部楼层

Re:求助:关于C++模板问题

哦  不好意思  那是不一样的   你可以把代码复制到你的编译器里运行看看~~~对于以上的问题我还是不怎么明白~~我觉得即使是对象,要自动复制的话也应该把私有数据也复制了~~但是上面的例子看上去就是没有复制啊~~~有没有人能帮我说清楚呢~~非常感谢了~~(小弟已经找了很久的资料了,但是还是得不到答案~~)

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-2 23:41:00 | 显示全部楼层

Re:求助:关于C++模板问题

  大家看~我在网上找的~~我想~我这里的问题应该可以由这篇文章来解决~~
http://blog.csdn.net/kevinlynx/archive/2006/03/02/614250.aspx

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-3 01:07:00 | 显示全部楼层

Re:求助:关于C++模板问题

OK 了 ~~现在终于弄明白为什么我原来的代码会是错的了~~a.Get_m_Node().Set_m_Data(1120);----首先:a.Get_m_Node()返回的只是一个临时对象----并不是m_Node对象,因此对其Set_m_Data只是对那个临时对象的成员进行了改变---而m_Node对象里的成员变量并没有变化,所以当a.Show_m_Node();调用m_Node.Get_m_Data();时就返回了并没有改变的m_Data;-----0~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 19:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表