나는 허프만 트리를 구현하는 템플릿으로 설계된 프로그램을 가지고 있습니다. My HuffmanNode 클래스에는 두 가지 데이터 유형이 있습니다. 다음은 클래스 구현입니다.C++에서 다른 데이터 형식을 사용하여 클래스 템플릿 포인터에 대한 포인터를 선언하는 방법
#pragma once
template <typename T, typename U> class HuffmanNode
{
private:
int frequency;
T value;
U code;
HuffmanNode<T, U>* left, *right;
public:
HuffmanNode<T, U>() :
value(' '), frequency(0), left(nullptr), right(nullptr) {}
HuffmanNode<T, U>(T v, U i) :
value(v), frequency(i), left(nullptr), right(nullptr) {}
HuffmanNode<T, U>(HuffmanNode<T, U>* left, HuffmanNode<T, U>* right)
{
this->left = left;
this->right = right;
frequency = left->getFrequency() + right->getFrequency();
value = NULL;
}
};
내 HuffTree 클래스에는 HuffmanNode 포인터를 가리키는 포인터가 있습니다. 내가 여러 가지 방법으로 HuffmanNode 포인터에 포인터를 선언했지만 어느 쪽이든, 나는 오류가 발생했습니다.
template <class T, class U>
HuffmanNode<T, U>** storage; // Error: 'HuffTree<T>::storage': only static data member templates are allowed
어떻게 이러한 포인터를 선언 할 것이다 :
HuffmanNode<T>** storage; // Error: 'HuffmanNode': too few template arguments
그런 다음 나는이 같은 두 데이터 유형의 시도 :
나는 이런 식으로 선언?
편집 : 나는 HuffmanNode 포인터에서 두 데이터 유형을 포함하는 HuffTree 클래스를 업데이트하지만 지금은 HuffTree 클래스를 포함 내 HuffmanCode 클래스에서 오류를 얻을.
#pragma once
#include <string>
#include <map>
#include"HuffmanTree.h"
using std::string;
using std::map;
template <typename T, typename U> class HuffmanCode
{
private:
string data;
string encodedData;
HuffTree<T, U>* tree;
map<T, U> frequencyTable;
map<T, U> huffmanTable;
void buildTree()
{
for (map<T, U>::iterator it = frequencyTable.begin();
it != frequencyTable.end(); ++it)
{
/*
this line gives me an error: 'HuffmanNode<char,std::string>::
HuffmanNode(const HuffmanNode<char,std::string> &)':
cannot convert argument 1 from 'const std::string' to 'char'
*/
tree->insert(new HuffmanNode<char, string>(it->first, it->second));
}
}
public:
HuffmanCode<T, U>(T input)
{
data = input;
encodedData = "";
// create tree to be large enough for worst case
tree = new HuffTree<T, U>(data.length());
buildTable();
buildTree();
}
};
는 여기를 테스트하는 내 소스 파일입니다 : 여기
#pragma once
#include "HuffmanNode.h"
using namespace std;
template <typename T, typename U> class HuffTree
{
private:
HuffmanNode<T, U>** storage;
int treeSize;
int capacity;
public:
HuffTree<T, U>(int size)
{
capacity = size;
treeSize = 0;
storage = new HuffmanNode<T, U>*[capacity];
for (int i = 0; i < capacity; i++)
{
storage[i] = NULL;
}
}
// I get an error in the HuffmanCode class when calling this function
void insert(HuffmanNode<T, U>* rhs)
{
treeSize++;
storage[treeSize - 1] = rhs;
percUp(treeSize - 1);
}
};
내가 포인터 문제를 해결하는 것이 지금 나에게 오류를 제공하는 HuffmanCode 클래스의 코드입니다 : 여기에 HuffTree 클래스에 대한 업데이트 된 코드는 기능 :
#include <iostream>
#include <string>
#include "HuffmanCode.h"
using namespace std;
int main()
{
string text;
cout << "Enter some text:\n";
getline(cin, text);
HuffmanCode<string, string>* huffText = new HuffmanCode<string, string>(text);
huffText->displayTable();
huffText->displayHuffmanTable();
string code = huffText->getEncodedString();
cout << "Encoded string: " << code << endl << endl;
cout << "Decoded string: " << huffText->decodeString(code) << endl << endl;
delete huffText;
return 0;
}
편집 관련 코드를 포함하는
은 "더블 포인터"같은 것은 없다 (또는 다른 데이터는 알아서 입력) . 템플릿을 사용하지 않고도 트리를 작성할 수 있습니까? 그렇지 않으면 템플릿을 사용하여 쓰기를 시도하지 마십시오. –
템플릿을 만드는 것은 어렵습니다 (처음에는 Scott Meyers, Herb Sutter, Sean Parent가 나와 동의하지 않습니다). Neil Butterworth의 조언은 정말 좋습니다. 시작하지 않고 클래스를 템플릿으로 만듭니다. 일단 작업을하게되면 세부 사항에서 템플릿을 "추상화"합니다. – Eljay
"더블 포인터"를 "포인터 투 포인터"로 변경하기 위해 내 게시물을 편집했습니다. 할당을 위해 템플릿을 사용하여 트리를 작성해야합니다. – softengstu