@NaName444

Как правильно использовать конструктор структуры?

Вопрос задан из-за незнания синтаксиса языка, времени на разбор нет, нагуглить нужное не получилось.
В общем, есть два файла, назовем их one.cpp и two.h.
Начнем с two.h
#pragma once
#include <stdio.h>

struct tree
{
	char elem = 0;
	tree *left = NULL,  *right = NULL;
};


struct list
{
	tree *elem = 0;
	list *next = NULL;
};

struct queue
{
	queue *s;
	tree *t;

	queue(queue *s, tree *t)
	{
		this->s = s;
		this->t = t;
	}

	list *beg = NULL, *end = NULL;


	void push(queue *s, tree *t);  // Добавление элемента в очередь

	tree *pop(queue *s);           // Вывод элемента из очереди

	bool empty(queue *q);          // Проверка очереди на пустоту

В файле есть структура queue, которая описывает очередь. Также я попытался сделать в этой структуре
конструктор, в котором текущей структуре двум ее переменным s и t присваиваются значения, передаваемые при помощи конструктора в файле one.cpp(Представлен ниже).Также эта структура содержит объявления функций для работы с очередью.
Файл one.cpp
#include "Tree.h"
#include <stdlib.h>

tree *add(tree *t, int a)
{
	if (t)
                 a < t->elem ? t->left = add(t->left, a) : t->right = add(t->right, a);
	else
	{
		t = new tree;
		t->elem = a;
	}
	return t;
}

int print(tree *t)
{
	if (t)
	{
		queue *q = new queue(q, t);
		//q->push();

		while (!empty(q))
		{
			if (t = pop(q))
			{
				printf_s("%d ", t->elem);

				if (t->left)
					push(q, t->left);

				if (t->right)
					push(q, t->right);

			}
		} 
	}
	else
		return 0;
}


void push(queue *q, tree *t)
{
	list *r = new list;
	r->elem = t;

	if (q->beg)
	{
		q->end->next = r;
		q->end = r;
	}
	else
		q->beg = q->end = r;
}
tree *pop(queue *q)
{
	list *r = q->beg;
	tree *t = q->beg->elem;

	if (!q->beg)
		return 0;

	q->beg = q->beg->next;

	delete r;

	return t;

}

bool empty(queue *q) { return q->beg == NULL; }


Проблема заключается в функции print. В данной функции я создаю очередь queue *q = new queue(q,t). Все это создавалось для того, чтобы представленные в файле one.cpp empty(), pop() и push() могли использоваться в файле one.cpp без передачи в них параметром очереди q и переменной t. Для этого я попытался при создании очереди передавать в нее при помощи конструктора переменные q и t, тем самым я бы мог использовать, например, функцию empty как q->empty(), а не empty(q) (т.е структура как-бы уже знает значения q и s и передает их в нужные функции ), но проблема в том, что представленные функции empty(), pop() и push() в любом случае ожидают параметр и в случае, если я не передаю параметр в эти функции, возникает ошибка отсутствия параметра в функции. Сама реализация функций pop, push, empty желательно должна быть в файле one.cpp. Какой правильный синтаксис нужен для решения задачи?
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вы передаете структуре в конструктор ее саму! Ее еще не создано, а вы ее передаете куда-то. Зачем вам вообще в структуре хранить ссылку на другую структуру? Это вы из питона, что ли взяли? В C++ не надо методам класса/структуры передавать указатель на нее, они средствами языка привязаны уже к экземпляру. Можно обращаться просто к членам структуры напрямую из методов. Или через this->, если есть конфликт имен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы