Добавление целых * в массив указателей - PullRequest
0 голосов
/ 14 ноября 2018

У меня много проблем с работой с нюансами указателей. Я пытаюсь добавить ссылки на целые числа в массив указателей int, но я не могу понять, как это правильно. Это мой код:

int main()
{
    ATree<int> testTree;
    int nums[12] = {5,4,3,7,6,1,2,12,15,9,8,11};
    int *ptr;
    int num, a;
    for (int i = 0; i < 5; ++i)
    {
        a = nums[i];
        *ptr = a;
        testTree.add(nums[i]);
    }
    cout << "Enter a value to search for" << endl;
    cin >> num;
    cout << testTree.search(num) << endl;
    return 0;
}

ATree.h

template <typename Item>
class ATree
{
    public:
    ATree();
    void add(Item);
    void add_helper(int, Item);
    int search(Item);
    int search_helper(int, Item);
    int get_size();
    private:
    int size;
    Item* tree[40];
};
#include "ATree.hpp"

ATree.hpp

template <typename Item>
ATree<Item>::ATree()
{
for (int i = 0; i < 40; ++i)
{ tree[i] = nullptr }
size = 0;
}
template <typename Item>
void ATree<Item>::add(Item obj)
{
    int n = 1;
    if ((tree[1]) == nullptr)
    {
        tree[1] = &obj;
    }
    else
    {
         add_helper(n, obj);
    }
}
template <typename Item>
void ATree<Item>::add_helper(int n, Item obj)
{       
    if (tree[n] == nullptr)
    {
        tree[n] = &obj;
    }
    else if (&obj > tree[n])
    {
        n = 2*n+1;
        add_helper(n, obj);
    }
    else
    {
        n = 2*n;
        add_helper(n, obj);
        }
    }
template <typename Item>
int ATree<Item>::search(Item obj)
{
    int n = 1;
    if (&obj == tree[1])
        { return 1; }
    else
        { return search_helper(n, obj);}
    }
template <typename Item>
int ATree<Item>::search_helper(int n, Item obj)
    {
    if (&obj == tree[n])
        { return n; }
    else if (&obj > tree[n])
    {
        n = 2*n+1;
        return search_helper(n, obj);
    }
    else
    {
        n = 2*n;
        return search_helper(n, obj);
    }
}
template <typename Item>
int ATree<Item>::get_size()
{return size;}

Концептуально я нахожу указатели относительно простыми, но как только они начинают передаваться между классами или массивами (кажется, что массивы обрабатывают их по-разному?), Это начинает становиться очень нелогичным для меня.

1 Ответ

0 голосов
/ 14 ноября 2018

В основном хранят объекты, а не указатели:

Item tree[40];

А затем сравните объекты, а не их указатели:

template <typename Item>
void ATree<Item>::add(Item obj)
{
    int n = 1;
    if ((tree[1]) == nullptr) // USe a counter here instead, to know how many objects are stored
    {
        tree[1] = obj;
    }
    else
    {
         add_helper(n, obj);
    }
}
template <typename Item>
void ATree<Item>::add_helper(int n, Item obj)
{       
    if (tree[n] == nullptr)
    {
        tree[n] = obj;
    }
    else if (obj > tree[n])
    {
        n = 2*n+1;
        add_helper(n, obj);
    }
    else
    {
        n = 2*n;
        add_helper(n, obj);
        }
    }
template <typename Item>
int ATree<Item>::search(Item obj)
{
    int n = 1;
    if (obj == tree[1])
        { return 1; }
    else
        { return search_helper(n, obj);}
    }
}
template <typename Item>
int ATree<Item>::search_helper(int n, Item obj)
    {
    if (obj == tree[n])
        { return n; }
    else if (&obj > tree[n])
    {
        n = 2*n+1;
        return search_helper(n, obj);
    }
    else
    {
        n = 2*n;
        return search_helper(n, obj);
    }
}

Этот код не тестировался и не работает как есть, так как вам нужно добавить счетчик, чтобы проверить, сколько элементов вы на самом деле храните (я бы посоветовал использовать std::vector<>), а также нет проверки границ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...