回 帖 发 新 帖 刷新版面

主题:[讨论]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 个 ==========

回复列表 (共1个回复)

沙发

把这些函数从.h中移到.cpp中

我来回复

您尚未登录,请登录后再回复。点此登录或注册