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

种模板分别编译模型中头文件里 #include "cpp" 的位置

2013-07-16 
类模板分别编译模型中头文件里 #include ...cpp 的位置本帖最后由 aytfly 于 2013-07-15 16:13:38 编辑

类模板分别编译模型中头文件里 #include "...cpp" 的位置
本帖最后由 aytfly 于 2013-07-15 16:13:38 编辑 类模板分别编译模型中头文件里 #include "...cpp" 的位置为什么一定要在头文件的尾部,在头部就
出现好多莫名奇妙的错误?另外,赋值操作符里那个if比较对吗?
代码如下(只看头文件一头一尾即可):
头文件:

#ifndef QUEUE_H
#define QUEUE_H
//#include "Queue.cpp"  // 放在这错误

template <class Type>
class QueueItem
{
QueueItem( const Type &t ) : item( t ), next( 0 ) { }
Type item;
QueueItem *next;
template <class Type> friend class Queue;
};

template <class Type>
class Queue
{
public:
Queue() : head( 0 ), tail( 0 ) { }
Queue( const Queue &Q ) : head( 0 ), tail( 0 )
{
copy_elems( Q );
}
Queue& operator = ( const Queue& ); //
~Queue()
{
destroy();
}
Type& front()
{
return head->item;
}
const Type& front() const
{
return head->item;
}
void push( const Type& ); //
void pop(); //
bool empty() const
{
return head == 0;
}
private:
QueueItem<Type> *head;
QueueItem<Type> *tail;
void destroy();
void copy_elems( const Queue& );
};

#include "Queue.cpp"  // 放在这正确
#endif

源文件:
#include "Queue.h"

template <class Type> 
void Queue<Type>::push( const Type &elem )
{
QueueItem<Type> *p = new QueueItem<Type>( elem );
if ( empty() )
{
head = p;
tail = p;
}
else
{
tail->next = p;
tail = p;
}
}

template <class Type>
void Queue<Type>::pop()
{
QueueItem<Type> *p = head;
head = head->next;
delete p;
}

template <class Type>
void Queue<Type>::destroy()
{
while ( !empty() )
pop();
}

template <class Type>
void Queue<Type>::copy_elems( const Queue &orig )
{
for ( QueueItem<Type> *pt = orig.head; pt; pt = pt->next )


push( pt->item );
}

template <class Type>
Queue<Type>& Queue<Type>::operator = ( const Queue &rhs )  // Queue<Type>&
{
// 有用吗?对吗?
if ( rhs == *this )
{
return *this;
}
else
{
destroy();
copy_elems( rhs );
}
return *this;
}

类 模板
[解决办法]
放在前面的时候类模板本身定义还没出现呢,就给出其成员的定义,肯定错误啊。
ps. c++ 不支持类模板分离编译模型。
[解决办法]
1. include cpp 还不如直接写在 .h 里. 出错原因就是楼上所说的了.
2. 

    if ( rhs == *this )
    {
        return *this;
    }


有用, 但一般是用 &rhs == this 
[解决办法]
引用:
Quote: 引用:

1. include cpp 还不如直接写在 .h 里. 出错原因就是楼上所说的了.
2. 

    if ( rhs == *this )
    {
        return *this;
    }


有用, 但一般是用 &rhs == this 

1.我就是写在.h里了呀
2. 为什么不用这个判断是否为本身,我用一个对象,自己给自已赋值,也没出错呢??destory不是已经把自己删除了吗?


rhs == *this 包含了是对象本身的情况撒. &rhs == this 时, rhs == *this 也会成立撒.  
[解决办法]
引用:
Quote: 引用:

放在前面的时候类模板本身定义还没出现呢,就给出其成员的定义,肯定错误啊。
ps. c++ 不支持类模板分离编译模型。
这样的话,函数模板就不会出现这个问题,对吗?

没看懂,上代码举例说明吧。
判断自身赋值一般用这个。


if (&rhs == this)

[解决办法]
如果不加判断,可能效率较低,因为如果是自己,还得销毁后再复制;
当然,如果加判断,可能效率也会变低,因为赋值前得先判断一次。
倒底加不加判断,还得从实际情况考虑
[解决办法]
if语句很有必要,这是最简单的防止无意义的自我复制。
假如是LZ所写的那样if(rhs == *this),这句话的前提是你的自定义类必须是支持operator==运算符运算的,否则编译不过。但是if(&rhs == this)这句话就是简单的判断两个指针的一致性,算是基本类型范畴的判等,而且更简单。

热点排行