主题:[讨论]C++找到一个或多个多重定义的符号
#pragma once
#include"BinaryTree.h"
#include"MinHeap.h"
class Huffman
{
public:
Huffman(void)
{
weight=0;
}
~Huffman(void){}
friend BinaryTree<char> HuffmanTree(int [],int,char [],int );//第一个传入频率,第二个传入字符,
friend bool operator>( const Huffman x1, const Huffman x2);
friend bool operator<=( const Huffman x1,const Huffman x2);
friend bool operator<(const Huffman x1, const Huffman x2);
BinaryTree<char> tree;
int weight;
};
bool operator>( const Huffman x1,const Huffman x2)
{
return x1.weight>x2.weight;
}
bool operator<=(const Huffman x1,const Huffman x2)
{
return x1.weight<=x2.weight;
}
bool operator<(const Huffman x1,const Huffman x2)
{
return x1.weight<x2.weight;
}
BinaryTree<char> HuffmanTree(int a[],int a_length,char c[],int c_length)//a[]传入各个字符的权重,c[]传入所有类型字符组成的数组,a_length, // c_length分别为a[],c[]的元素个数
{
Huffman*w=new Huffman[a_length+1];
BinaryTree<char>z,zero;
for(int i=1;i<=a_length;i++)
{
z.MakeTree(c[i-1],zero,zero);
w[i].weight=a[i-1];
w[i].tree=z;
}
MinHeap<Huffman>H(1);
Huffman x;
/*H.Initialize(w,a_length,a_length-1);
Huffman x,y;
for(int i=1;i<a_length;i++)
{
H.DeleteMin(x);
H.DeleteMin(y);
z.MakeTree(0,x.tree,y.tree);
x.weight+=y.weight ;x.tree=z;
H.Insert(x);
}
H.DeleteMin(x);
H.Deactivate();
delete []w;*/
return x.tree;
}
#pragma once
#include<iostream>
using namespace std;
template<class T>
class BinaryTreeNode
{
public:
BinaryTreeNode(const T &e,BinaryTreeNode<T>*l,BinaryTreeNode<T>*r);
~BinaryTreeNode<T>();
template<class T>
friend void pre(BinaryTreeNode<T>*);
private:
T data;
BinaryTreeNode<T>*leftchild;
BinaryTreeNode<T>*rightchild;
};
template<class T>
void pre(BinaryTreeNode<T>*t)
{
if(t)
{
cout<<t->data<<" ";
pre(t->leftchild);
pre(t->rightchild);
}
}
template<class T>
BinaryTreeNode<T>::BinaryTreeNode(const T &e,BinaryTreeNode<T>*l,BinaryTreeNode<T>*r)
{
data=e;
leftchild=l;
rightchild=r;
}
template<class T>
BinaryTreeNode<T>::~BinaryTreeNode()
{
}
template<class T>
class BinaryTree
{
public:
BinaryTree(void);
~BinaryTree(void);
void MakeTree( const T &e,BinaryTree<T>&l,BinaryTree<T>&r);
void PreOrder(BinaryTree<T>&);
private:
BinaryTreeNode<T>*root;//根节点
};
template<class T>
BinaryTree<T>::BinaryTree()
{
root=0;
}
template<class T>
BinaryTree<T>::~BinaryTree()
{
}
template<class T>
void BinaryTree<T>::PreOrder(BinaryTree<T>&x)
{
BinaryTreeNode<T>*t;
t=x.root;
pre(t);
}
template<class T>
void BinaryTree<T>::MakeTree(const T& e,BinaryTree<T>&l,BinaryTree<T>&r)
{
root=new BinaryTreeNode<T>(e,l.root ,r.root);
l.root=r.root=0;
}
#pragma once
#include "OutOfBounds.h"
#include<stdlib.h>
template<class T>
class MinHeap
{
public:
MinHeap(int MinHeapSize = 10);
~MinHeap() {delete [] heap;}
int Size() const {return CurrentSize;}
T Min()
{
if (CurrentSize == 0)
throw OutOfBounds();
return heap[1];
}
MinHeap<T>& Insert( T& x);
MinHeap<T>& DeleteMin(T& x);
void Initialize(T a[], int size, int ArraySize);
void Deactivate() {heap = 0;}
void Output() const;
MinHeap<T>& GetHeap();
private:
int CurrentSize, MaxSize;
T *heap;
};
template<class T>
MinHeap<T>&MinHeap<T>::GetHeap()
{
return heap;
}
template<class T>
MinHeap<T>::MinHeap(int MinHeapSize)
{
MaxSize = MinHeapSize;
heap = new T[MaxSize+1];
CurrentSize = 0;
}
template<class T>
MinHeap<T>& MinHeap<T>::Insert( T& x)
{
if (CurrentSize == MaxSize)
{
cout<<"溢出!"<<endl;
system("pause");
}
//为x寻找应插入的位置
//i从新的叶节点开始,并沿着树上升
int i = ++CurrentSize;
while (i != 1 && x < heap[i/2])
{
heap[i] = heap[i/2]; // 将元素下移
i /= 2; // 移向父节点
}
heap[i] = x;
return *this;
}
template<class T>
MinHeap<T>& MinHeap<T>::DeleteMin(T& x)
{
if (CurrentSize == 0)
throw OutOfBounds();
x = heap[1];
T y = heap[CurrentSize--]; //最后一个元素
// 从根开始, 为y寻找合适的位置
int i = 1, // 堆的当前节点
ci = 2; // i的子节点
while (ci <= CurrentSize)
{
// 使heap[ci] 是i较小的子节点
if (ci < CurrentSize
&& heap[ci] > heap[ci+1])
ci++;
// 能把y放入heap[i]吗?
if (y <= heap[ci])
break; // 能
// 不能
heap[i] = heap[ci]; // 子节点上移
i = ci; // 下移一层
ci *= 2;
}
heap[i] = y;
return *this;
}
template<class T>
void MinHeap<T>::Initialize(T a[], int size, int ArraySize)
{ //size为数组a的元素的个数,ArraySize为数组从a[1]算起的元素个数
delete [] heap;
heap=new T[size+1];
for(int i=1;i<=size;i++)
heap[i]=a[i];
CurrentSize = size;
MaxSize = ArraySize;
// 产生一个最小堆
for (int i = CurrentSize/2; i >= 1; i--)
{
T y = heap[i]; // 子树的根
// 寻找放置y的位置
int c = 2*i; // c 的父节点是y的目标位置
while (c <= CurrentSize)
{
// 使heap[c]是较小的子节点
if (c < CurrentSize &&
heap[c] > heap[c+1]) c++;
// 能把y放入heap[c/2]吗?
if (y <= heap[c]) break; // 能
// 不能
heap[c/2] = heap[c]; // 子节点上移
c *= 2; // 下移一层
}
heap[c/2] = y;
}
}
template<class T>
void MinHeap<T>::Output() const
{
cout << "The " << CurrentSize
<< " elements are"<< endl;
for (int i = 1; i <= CurrentSize; i++)
cout << heap[i] << " ";
cout << endl;
}
主函数中未写任何东西;编译过程中出现这样的错误,我反复查找,就是不知道错误在哪里啊啊!
1>------ 已启动全部重新生成: 项目: Huffman压缩, 配置: Debug Win32 ------
1> stdafx.cpp
1> OutOfBounds.cpp
1> MinHeap.cpp
1> Huffman压缩.cpp
1> Huffman.cpp
1> BinaryTree.cpp
1> 正在生成代码...
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator>(class Huffman,class Huffman)" (??O@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator<=(class Huffman,class Huffman)" (??N@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator<(class Huffman,class Huffman)" (??M@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "class BinaryTree<char> __cdecl HuffmanTree(int * const,int,char * const,int)" (?HuffmanTree@@YA?AV?$BinaryTree@D@@QAHHQADH@Z) 已经在 Huffman.obj 中定义
1>d:\my documents\visual studio 2010\Projects\Huffman压缩\Debug\Huffman压缩.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
#include"BinaryTree.h"
#include"MinHeap.h"
class Huffman
{
public:
Huffman(void)
{
weight=0;
}
~Huffman(void){}
friend BinaryTree<char> HuffmanTree(int [],int,char [],int );//第一个传入频率,第二个传入字符,
friend bool operator>( const Huffman x1, const Huffman x2);
friend bool operator<=( const Huffman x1,const Huffman x2);
friend bool operator<(const Huffman x1, const Huffman x2);
BinaryTree<char> tree;
int weight;
};
bool operator>( const Huffman x1,const Huffman x2)
{
return x1.weight>x2.weight;
}
bool operator<=(const Huffman x1,const Huffman x2)
{
return x1.weight<=x2.weight;
}
bool operator<(const Huffman x1,const Huffman x2)
{
return x1.weight<x2.weight;
}
BinaryTree<char> HuffmanTree(int a[],int a_length,char c[],int c_length)//a[]传入各个字符的权重,c[]传入所有类型字符组成的数组,a_length, // c_length分别为a[],c[]的元素个数
{
Huffman*w=new Huffman[a_length+1];
BinaryTree<char>z,zero;
for(int i=1;i<=a_length;i++)
{
z.MakeTree(c[i-1],zero,zero);
w[i].weight=a[i-1];
w[i].tree=z;
}
MinHeap<Huffman>H(1);
Huffman x;
/*H.Initialize(w,a_length,a_length-1);
Huffman x,y;
for(int i=1;i<a_length;i++)
{
H.DeleteMin(x);
H.DeleteMin(y);
z.MakeTree(0,x.tree,y.tree);
x.weight+=y.weight ;x.tree=z;
H.Insert(x);
}
H.DeleteMin(x);
H.Deactivate();
delete []w;*/
return x.tree;
}
#pragma once
#include<iostream>
using namespace std;
template<class T>
class BinaryTreeNode
{
public:
BinaryTreeNode(const T &e,BinaryTreeNode<T>*l,BinaryTreeNode<T>*r);
~BinaryTreeNode<T>();
template<class T>
friend void pre(BinaryTreeNode<T>*);
private:
T data;
BinaryTreeNode<T>*leftchild;
BinaryTreeNode<T>*rightchild;
};
template<class T>
void pre(BinaryTreeNode<T>*t)
{
if(t)
{
cout<<t->data<<" ";
pre(t->leftchild);
pre(t->rightchild);
}
}
template<class T>
BinaryTreeNode<T>::BinaryTreeNode(const T &e,BinaryTreeNode<T>*l,BinaryTreeNode<T>*r)
{
data=e;
leftchild=l;
rightchild=r;
}
template<class T>
BinaryTreeNode<T>::~BinaryTreeNode()
{
}
template<class T>
class BinaryTree
{
public:
BinaryTree(void);
~BinaryTree(void);
void MakeTree( const T &e,BinaryTree<T>&l,BinaryTree<T>&r);
void PreOrder(BinaryTree<T>&);
private:
BinaryTreeNode<T>*root;//根节点
};
template<class T>
BinaryTree<T>::BinaryTree()
{
root=0;
}
template<class T>
BinaryTree<T>::~BinaryTree()
{
}
template<class T>
void BinaryTree<T>::PreOrder(BinaryTree<T>&x)
{
BinaryTreeNode<T>*t;
t=x.root;
pre(t);
}
template<class T>
void BinaryTree<T>::MakeTree(const T& e,BinaryTree<T>&l,BinaryTree<T>&r)
{
root=new BinaryTreeNode<T>(e,l.root ,r.root);
l.root=r.root=0;
}
#pragma once
#include "OutOfBounds.h"
#include<stdlib.h>
template<class T>
class MinHeap
{
public:
MinHeap(int MinHeapSize = 10);
~MinHeap() {delete [] heap;}
int Size() const {return CurrentSize;}
T Min()
{
if (CurrentSize == 0)
throw OutOfBounds();
return heap[1];
}
MinHeap<T>& Insert( T& x);
MinHeap<T>& DeleteMin(T& x);
void Initialize(T a[], int size, int ArraySize);
void Deactivate() {heap = 0;}
void Output() const;
MinHeap<T>& GetHeap();
private:
int CurrentSize, MaxSize;
T *heap;
};
template<class T>
MinHeap<T>&MinHeap<T>::GetHeap()
{
return heap;
}
template<class T>
MinHeap<T>::MinHeap(int MinHeapSize)
{
MaxSize = MinHeapSize;
heap = new T[MaxSize+1];
CurrentSize = 0;
}
template<class T>
MinHeap<T>& MinHeap<T>::Insert( T& x)
{
if (CurrentSize == MaxSize)
{
cout<<"溢出!"<<endl;
system("pause");
}
//为x寻找应插入的位置
//i从新的叶节点开始,并沿着树上升
int i = ++CurrentSize;
while (i != 1 && x < heap[i/2])
{
heap[i] = heap[i/2]; // 将元素下移
i /= 2; // 移向父节点
}
heap[i] = x;
return *this;
}
template<class T>
MinHeap<T>& MinHeap<T>::DeleteMin(T& x)
{
if (CurrentSize == 0)
throw OutOfBounds();
x = heap[1];
T y = heap[CurrentSize--]; //最后一个元素
// 从根开始, 为y寻找合适的位置
int i = 1, // 堆的当前节点
ci = 2; // i的子节点
while (ci <= CurrentSize)
{
// 使heap[ci] 是i较小的子节点
if (ci < CurrentSize
&& heap[ci] > heap[ci+1])
ci++;
// 能把y放入heap[i]吗?
if (y <= heap[ci])
break; // 能
// 不能
heap[i] = heap[ci]; // 子节点上移
i = ci; // 下移一层
ci *= 2;
}
heap[i] = y;
return *this;
}
template<class T>
void MinHeap<T>::Initialize(T a[], int size, int ArraySize)
{ //size为数组a的元素的个数,ArraySize为数组从a[1]算起的元素个数
delete [] heap;
heap=new T[size+1];
for(int i=1;i<=size;i++)
heap[i]=a[i];
CurrentSize = size;
MaxSize = ArraySize;
// 产生一个最小堆
for (int i = CurrentSize/2; i >= 1; i--)
{
T y = heap[i]; // 子树的根
// 寻找放置y的位置
int c = 2*i; // c 的父节点是y的目标位置
while (c <= CurrentSize)
{
// 使heap[c]是较小的子节点
if (c < CurrentSize &&
heap[c] > heap[c+1]) c++;
// 能把y放入heap[c/2]吗?
if (y <= heap[c]) break; // 能
// 不能
heap[c/2] = heap[c]; // 子节点上移
c *= 2; // 下移一层
}
heap[c/2] = y;
}
}
template<class T>
void MinHeap<T>::Output() const
{
cout << "The " << CurrentSize
<< " elements are"<< endl;
for (int i = 1; i <= CurrentSize; i++)
cout << heap[i] << " ";
cout << endl;
}
主函数中未写任何东西;编译过程中出现这样的错误,我反复查找,就是不知道错误在哪里啊啊!
1>------ 已启动全部重新生成: 项目: Huffman压缩, 配置: Debug Win32 ------
1> stdafx.cpp
1> OutOfBounds.cpp
1> MinHeap.cpp
1> Huffman压缩.cpp
1> Huffman.cpp
1> BinaryTree.cpp
1> 正在生成代码...
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator>(class Huffman,class Huffman)" (??O@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator<=(class Huffman,class Huffman)" (??N@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "bool __cdecl operator<(class Huffman,class Huffman)" (??M@YA_NVHuffman@@0@Z) 已经在 Huffman.obj 中定义
1>Huffman压缩.obj : error LNK2005: "class BinaryTree<char> __cdecl HuffmanTree(int * const,int,char * const,int)" (?HuffmanTree@@YA?AV?$BinaryTree@D@@QAHHQADH@Z) 已经在 Huffman.obj 中定义
1>d:\my documents\visual studio 2010\Projects\Huffman压缩\Debug\Huffman压缩.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========