Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Key27
3 / 3 / 0
Регистрация: 02.04.2017
Сообщений: 213
1

Ввод элементов в хранилище данных

10.11.2017, 14:46. Просмотров 183. Ответов 5
Метки нет (Все метки)

Нужно создать хранилище данных(это дерево из стеков).При добавлении в хранилище( в каждом стеке не более 5 элементов)
Кликните здесь для просмотра всего текста

container.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <memory>
#include <cstring>
#include "btree.h"
#include "stack.h"
#include "criteria.h"
 
template <class T>
class Container
{
public:
    void add(const std::shared_ptr<T>& item);
    void erase(const Criteria<T>& criteria);
    //void print() const;
 
    template <class K>
    friend std::ostream& operator << (std::ostream& os, const Container<K>& container);
 
private:
    Btree<Stack<T>> m_container;
};
 
#include "container.cpp"
container.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
template <class T>
void Container<T>::add(const std::shared_ptr<T>& item)
{
 
    auto lastContIt = m_container.begin();
    
    if (lastContIt == m_container.end())
        m_container.bstInsert(std::make_shared<Stack<T>>());
    
    lastContIt = m_container.begin();
 
    while (lastContIt.getItem()->GetNext() != nullptr)// Ошибка тут
        ++lastContIt;
 
    if ((*lastContIt)->size() == 5)
    {
        m_container.bstInsert(std::make_shared<Stack<T>>());
        ++lastContIt;
    }
 
    (*lastContIt)->Push(item);
 
    for (unsigned int i = (*lastContIt)->size() - 1; i > 0; --i)
    {
        auto lastElemIt = (*lastContIt)->get(i);
        auto preLastElemIt = (*lastContIt)->get(i - 1);
 
        if (strcmp(preLastElemIt->getName(), lastElemIt->getName()) <= 0)
            break;
 
        preLastElemIt.getItem()->swap(*lastElemIt.getItem());
    }
}


ругается
Bash
1
2
3
4
5
/tmp/ccAWTMmg.o: In function `BTreeItem<Stack<Figure> >::GetNext()':
main.cpp:(.text._ZN9BTreeItemI5StackI6FigureEE7GetNextEv[_ZN9BTreeItemI5StackI6FigureEE7GetNextEv]+0xd0): undefined reference to `TStack<std::shared_ptr<BTreeItem<Stack<Figure> > > >::pop()'
/tmp/ccAWTMmg.o: In function `BTreeItem<Stack<Figure> >::GoFarLeft(std::shared_ptr<BTreeItem<Stack<Figure> > >)':
main.cpp:(.text._ZN9BTreeItemI5StackI6FigureEE9GoFarLeftESt10shared_ptrIS3_E[_ZN9BTreeItemI5StackI6FigureEE9GoFarLeftESt10shared_ptrIS3_E]+0x47): undefined reference to `TStack<std::shared_ptr<BTreeItem<Stack<Figure> > > >::push(std::shared_ptr<BTreeItem<Stack<Figure> > > const&)'
collect2: error: ld returned 1 exit status
GetNext это метод обхода дерева с помощью отдельного стека

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template <typename R>
shared_ptr<BTreeItem<R>> BTreeItem<R>::GoFarLeft(shared_ptr<BTreeItem<R>> current) {
    if (current == nullptr) {
        return nullptr;
    }
    while (current->getLeft() != nullptr) {
        stackOfBTreeItem.push(current);
        current = current->getLeft();
    }
    return current;
};
 
template <typename R>
shared_ptr<BTreeItem<R>> BTreeItem<R>::GetNext(){
    shared_ptr<BTreeItem<R>> temp;
    if (this->getRight() != nullptr) {
        temp = GoFarLeft(this->getRight());
    }
    else if(!stackOfBTreeItem.IsEmpty()){
        temp = stackOfBTreeItem.pop();
    }
    else {
        temp = nullptr;
    }
    return temp;
};


Стек для GetNext
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using std::shared_ptr;
const int MAX_TSTACK_SIZE = 20;
 
template <typename R>
class TStack {
private:
    R items[MAX_TSTACK_SIZE];
    int top;
public:
    TStack() : top(0) {};
    bool IsEmpty() const { return  top == 0; };
    bool IsFull() const { return top == MAX_TSTACK_SIZE; };
    void push(const R & itm);
    R pop();
    void ClearStack() { top = 0; };
};
 
template <typename R>
void TStack<T>::push(const T & itm) {
    if (top == MAX_TSTACK_SIZE) {
        std::cerr << "TStack is full!\n";
        exit(1);
    }
    else {
        items[top++] = itm;
    }
}
 
template <typename R>
R TStack<T>::pop() {
    T temp(0);
    if (top > 0) {
        temp = items[--top];
        return temp;
    }
    else {
        std::cerr << "TStack is empty!\n";
        exit(1);
    }
}



Как это исправить?

Добавлено через 1 час 36 минут
Буду рад любым идеям. Также готов выложить всю программу целиком, только там 20+ файлов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2017, 14:46
Ответы с готовыми решениями:

Ввод структурированных данных в файл и вывод данных из этого файла на экран (сделать хранилище данных в файле)
Здравствуйте) помогите написать программу, осуществляющую ввод...

Разработайте программу, в которой организован ввод элементов одномерного массива и вывод данных элементов
Разработайте программу, в которой организован ввод элементов одномерного...

Байтовое хранилище данных
Привет, народ. Есть задача - в руки мне даётся структура, предназначенная для...

Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN
помогите пожалуйста, не получается сделать,туго с динамикой. • Описать...

Напишите программу, которая заменит каждый положительный элемент суммой всех элементов массива. Ввод данных
Привет!Ребят,если не сложно сможете помочь? то я чайник в C++:( Спасибо...

5
jahdjkhasjdhjah
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
10.11.2017, 15:30 2
Цитата Сообщение от Key27 Посмотреть сообщение
undefined reference to `TStack<std::shared_ptr<BTreeItem<Stack<Figure> > > >:op()
Цитата Сообщение от Key27 Посмотреть сообщение
undefined reference to `TStack<std::shared_ptr<BTreeItem<Stack<Figure> > > >:ush()
??? Не? Не оно?
0
Key27
3 / 3 / 0
Регистрация: 02.04.2017
Сообщений: 213
10.11.2017, 16:01  [ТС] 3
jahdjkhasjdhjah, именно оно! Вопрос в этом и заключается. Почему reference undefined, если должен быть defined
0
jahdjkhasjdhjah
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
10.11.2017, 16:28 4
Наверное, потому, что там, где вы ее используете - она не видна? Определили не в том файле. Или забыли хэдер подключить. Или еще чего..
Или, если линкер ругается, то попробуйте поменять порядок линковки.

Вот хорошая статья по линкеру https://habrahabr.ru/post/150327/
1
Key27
3 / 3 / 0
Регистрация: 02.04.2017
Сообщений: 213
10.11.2017, 16:36  [ТС] 5
jahdjkhasjdhjah, о, супер. Буду разбираться
0
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,165
Завершенные тесты: 1
10.11.2017, 18:04 6
Цитата Сообщение от Key27 Посмотреть сообщение
Как это исправить?
1.
зарубить себе на носу:
шаблоны не разделяют на хедер/спп.
шаблонно код пишется только в хедерах.

2.
перетащить реализацию шаблонно-класса в хедер.

3.
удалить ставший ненужным спп файл.

4.
на будущие: научиться пользоваться гуглом.
вы уже 100500, кто наступил на эти грабли.
можно было бы за 30 секунд нагуглить вопрос.

5.
читать Джоссатиса или Александресску.
1
10.11.2017, 18:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2017, 18:04

Как правильно заменить ввод данных простой на ввод с клавиатуры?
#include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace...

Потоковый ввод и ввод данных. Работа с числами
Ввести с экрана два нат. числа. Найти частное первого на второе и определить,...

Ввод данных, добавление данных, получение информации из файла по заданным критериям выборки
Все привет!!!Обращаюсь к вам за помощью...никак не получается решить задачку......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru