Как сделать так, чтобы в шаблонно бинарном дереве содержались объекты пользовательского класса не разрушались,после инициализации?

299
06 ноября 2017, 22:37

Нужно сделать так, чтобы в шаблонном бинарном дереве содержались объекты пользовательского класса T и не разрушались после инициализации. Добавление в дерево осуществляется через функцию, где и создаются элементы дерева:

template <class T>
void Switch(T field)
{
    ExceptionInput *e = new ExceptionInput();
    Tree<T>* tree = new Tree<T>();
    tree->Add(field);
    char answer;
    int     c, i=0;
    T field1;
    do {
        system("cls");
        cout << "Input number of method" << endl;
        cout << "1.Add" << endl;
        cout << "2.Delete one element" << endl;
        cout << "3.Look for node(return node)" << endl;
        cout << "4.Search element(return true/false)" << endl;
        cout << "5.Delete tree" << endl;
        cout << "6.Show" << endl;
        cin.clear();
        cin.ignore(1000, '\n');
        do {
            cin>>c ;
            if (c > 6 || c <= 0)
                cout <<"number must be >0 and <7"<<endl;
        } while (c > 6 || c <= 0);
        switch (c)
        {
        case 1:
            if (i != 0)
            {
              cout << "input field" << endl;
               cin >> field1;
            }
            if(cin)
            tree->Add(field1); 
            else cout << "Error." <<" Field must be type of "<< (char *) typeid(field).name()<< endl;
                break;
        case 2:
            if (i != 0)
            {
                cout << "input field" << endl;
                cin >> field1;
            }
            if (cin)
            tree->Delete(field1);
            else cout << "Error." << " Field must be type of " << (char *) typeid(field).name() << endl;
            break;
        case 3:
            if (i != 0)
            {
                cout << "input field" << endl;
                cin >> field1;
            }
            if (cin)
            tree->LookForNode(tree->GetRoot(), field);
            else 
                cout << "Error." << " Field must be type of " << (char *) typeid(field).name() << endl;
            break;
        case 4:
            if (i != 0)
            {
                cout << "input field" << endl;
                cin >> field1;
            }
            if (cin)
            cout<<tree->Search(field1); 
            else 
                cout << "Error." << " Field must be type of " << (char *) typeid(field).name() << endl; 
            break;
        case 5:tree->Delete(); break;
        case 6:tree->Show(); break;
        default:
            break;
        }
        cin.clear();
        cin.ignore(1000,'\n');
        i++;
        cout<<endl<<"Switch continue(y/n)" << endl;
        cin >> answer;
    } while (answer == 'y');
}
Answer 1

Предположу, что вы видите удаление временных объектов. Это зависит от функции Add вашего дерева, то есть если она объявлена не вот так:

bool Tree::Add(const T & element)
{
    // добавление нового узла
}

А вот так:

bool Tree::Add(T element)
{
    // добавление нового узла
}

То при каждом вызове Add будет создаваться временная копия исходного field под именем element, а потом после завершения функции еще и удаляться. Возможно поэтому вы видите трассировку вызовов конструкторов и деструкторов.

На самом же деле ваша проблема легко решается в отладчике.

READ ALSO
DirectX - не удается открыть файл

DirectX - не удается открыть файл

При компиляции проекта в конфигурации Release и платформе Win32(да, во вех остальных случаях работает) получаю следующую ошибку:

356
Qt + Tesseract как исправить проблемы

Qt + Tesseract как исправить проблемы

Подскажите пожалуйста как правильно прописать в про файле путь к либам

252
Как выделить цветом элемент массива [требует правки]

Как выделить цветом элемент массива [требует правки]

Имеется матрица, и в ней необходимо выделить другим цветом (допустим зелёным) главную диагональКак это можно сделать?

457