首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

初学者请问怎样调试这个template程序

2012-03-17 
菜鸟请教怎样调试这个template程序?书上给了给template源码,本人初学菜鸟,不知道还要加哪些代码和文件才能

菜鸟请教怎样调试这个template程序?
书上给了给template源码,本人初学菜鸟,不知道还要加哪些代码和文件才能在vs2005里调试程序,请大虾指教!

template   <typename   Object>
class   MemoryCell
{
      public:
          explicit   MemoryCell(const   Object   &   initialValue=Object())
                :storedValue(initialValue){}
          const   Object   &   read()   const
                {return   storedValue;}
          void   write(const   Object   &   x)
                {storedValue=x;}
      private:
          Object   storedValue;
};

int   main()
{
        MemoryCell <int>     m1;
        MemoryCell <string>   m2;( "hello ");

        m1.write(37);
        m2.write(m2.read()+ "world ");
        cout < <m1.read() < <endl < <m2.read() < <endl;

        return   0;
}

(1)还要加哪些东西才能运行这个程序?
(2)构造函数
          explicit   MemoryCell(const   Object   &   initialValue=Object())
                :storedValue(initialValue){}
          里执行的是哪些操作?
(3)在read()里返回的storedValue是Object实例,为什么返回的是Object   &,
          而不是直接的Object?




[解决办法]

#include <iostream>
#include <string>
using namespace std;
[解决办法]
(1)仅仅使用initialValue显式的初始化了storedValue,没啥别的动作;
(2)通过const引用返回对象内部成员,既高效,又安全,如果直接按值返回Object,会引入一次拷贝。
[解决办法]
(3):
那样的效率高点,具体看下effective c++
[解决办法]
单形参构造函数应该为explicit的,可以避免错误..
[解决办法]
explict就是表示这个构造函数只能用来做显示构造,不能用来作隐式转换。
比如:
Object o;
你可以写:
MemoryCell cell(o);//通过o来构造一个MemoryCell对象。
但不能写:
MemoryCell cell = o;
因为后者表示把一个Object对象转换成MemoryCell对象,再拿来初始化cell。

在函数的参数传递过程中也是这样,比如某个函数原型是:
void f(MomeryCell cell);
你可以这样调用:
f(cell);
但不可以这样调用:
f(o);
如果没有那个explicit,就没关系了。
[解决办法]
explicit MemoryCell(const Object & initialValue=Object()):storedValue(initialValue){}
这句真有点看不懂,哪个能解释下
===================================

晨星 大哥不是说了么....仅仅使用initialValue显式的初始化了storedValue,没啥别的动作
[解决办法]
突然发现MemoryCell <string> m2;( "hello ");
m2后面有个分号...

[解决办法]
Up
[解决办法]
我希望楼主能花些时间看完我的回贴,写的好累...


(1)还要加哪些东西才能运行这个程序?

我看楼主的程序,m2.write(m2.read()+ "world ")这句话中,m2.read()返回一个Object的引用,所以程序中还缺少一个重载的 "+ "操作符.并要声明为友元.具体实现如下:



在类里面:
friend Object& operator+(const Object&,string&);
全局:
#include <string>
#include <iostream>
using namespace std;
Object & operator+(const Object& ob,string& str)
{
/*...一切操作...*/ //因为不是任何类型和 string相加都有意义的,所以没写
}


(2)构造函数
explicit MemoryCell(const Object & initialValue=Object())
:storedValue(initialValue){}
里执行的是哪些操作?


explicit加在构造函数的前面之后,构造函数就不能被隐式的调用,否则可以隐式的被调用,举个例子楼主就懂了

class A
{
public:
A(){};
A(int x);
A operator+(const A& a);
private:
int data;
}
A::A(int x)
{
data=x;
}
A A::operator+(const A& a);
{
A a;
a=this-> data+a.data;
return a;
}
int main()
{
A a(3);
A b(5);
A c;
c=a+b; //调用了operator+,可以正确的运行
c=a+7; //因为operator+要求的是两个A类型的形参,所以7会自动的被A(int x)转换为一个A的对象,然后再与a相加,而你如果在A(int x)这个构造函数前加了explicit,则这个7到a的转换不会执行,c=a+7会报错
}


(3)在read()里返回的storedValue是Object实例,为什么返回的是Object &,
而不是直接的Object?

返回Object&这是Object类型的引用,它返回的只是一个地址,效率很高
如果返回的是Object这个对象,那是按值返回,它将调用Object的拷贝构造函数,在Object类的规模很大时,效率低下

热点排行