C ++ массив самоопределяемого класса, без соответствующего вызова функции - PullRequest
1 голос
/ 27 апреля 2020

Я строил дерево кодирования Хаффмана и хотел создать массив, в котором каждая позиция содержит отдельное дерево, как показано в следующем коде:

// Number of initial nodes
int number;
cin >> number;
int* weights = new int[number];

for (int i = 0; i < number; i++) 
    cin >> weights[i];

// Convert to huffman tree with one element
intHuffTree* tree = new intHuffTree[number];
for (int i = 0; i < number; i++) {
    tree[i] = intHuffTree(weights[i]);
}

, где класс определяется следующим образом:

// Huffman tree with integers
class intHuffTree {
private:
    // Root of the tree
    intHuffNode* Root;

public:
    // Leaf constructor
    intHuffTree (int freq) { Root = new intLeafNode(freq); }

    // Internal constructor
    intHuffTree (intHuffTree* l, intHuffTree* r) {
        Root = new intIntlNode(l->root(), r->root());
    }

    // Destructor
    ~intHuffTree() {};

    // Get root
    intHuffNode* root() { return Root; }

    // Root weight
    int weight() { return Root->weight(); }
};

При компиляции я получил такие ошибки как:

main.cpp: In function ‘int main()’:
main.cpp:19:47: error: no matching function for call to ‘intHuffTree::intHuffTree()’
     intHuffTree* tree = new intHuffTree[number];
                                               ^

Интересно, почему я не смог инициализировать массив, как я это сделал для массива int, и есть ли какое-нибудь возможное решение?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 27 апреля 2020
intHuffTree* tree = new intHuffTree[number];

Вышеупомянутое утверждение создает массив intHuffTree. Массив будет содержать элементы «число». Каждый элемент будет иметь тип intHuffTree. Для создания каждого элемента компилятору нужен конструктор по умолчанию, который отсутствует в вашем коде, поскольку вы предоставили перегруженные конструкторы.

Если вы намереваетесь создать одно дерево с элементами 'number', вам нужно записать его как

intHuffTree* tree = new intHuffTree(number);

Если вы намереваетесь создать массив элементов 'number' из intHuffTree, который вам нужен добавить конструктор без аргументов.

intHuffTree () { /* Do the right things here. */ }
0 голосов
/ 27 апреля 2020

intHuffTree* tree = new intHuffTree[number];

пытается выделить массив с number элементами. Для этого будет вызван конструктор по умолчанию (тот, который может быть вызван без параметров), но ваш класс не имеет его. «т. Чтобы создать экземпляр, вы можете написать

InHuffTree tree(number);

Если вы хотите создать массив с number элементами, вам нужно предоставить конструктор по умолчанию.

0 голосов
/ 27 апреля 2020

Возьмите ваш код:

new intHuffTree[number];

Это говорит о том, что «создайте N intHuffTrees с помощью конструктора по умолчанию», где N равно number. У вас нет конструктора по умолчанию, о чем вам и сообщает сообщение об ошибке.

Глядя на ваш код, возможно, вы намеревались вместо этого передать number в конструктор? В этом случае код будет:

new intHuffTree(number);

Обратите внимание, что изменение в скобках.

...