Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Mike_device
3 / 3 / 5
Регистрация: 11.05.2013
Сообщений: 139
#1

Рекурсивное определение типов

14.10.2013, 14:44. Просмотров 664. Ответов 15
Метки нет (Все метки)

Здравствуйте, у меня возникла проблема.
Есть код
C++
1
2
3
4
5
6
7
8
typedef void* BaseType;
 
typedef element *ptrel;
 
typedef  struct  {
    basetype data;
    ptrel next;
} element;
Суть такова, что тип element используется до определения. Причем избежать этого невозможно. Нужно заствать это работать. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2013, 14:44
Ответы с готовыми решениями:

Рекурсивное определение палиндрома
Напишите рекурсивную программу, которая определяет, является ли данное...

Рекурсивное определение действия лекарств
Реакция организма на действие лекарственного препарата через n часов после...

Определение границ типов данных
Задача такова. Требуется определить максимальные границы для основных типов...

Шаблоны, рекурсия, определение типов std::function
#include <tuple> #include <vector> #include <iostream> #include <functional>...

Шаблоны и определение SSE типов на этапе компиляции
Добрый вечер. Задача следующая: для каждого базового типа даных int, float и...

15
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 14:52 #2
Цитата Сообщение от Mike_device Посмотреть сообщение
Суть такова, что тип element используется до определения. Причем избежать этого невозможно. Нужно заствать это работать. Спасибо!
Если до определения то указатели нужно использовать, попробуй как то так:
C++
1
2
3
4
5
6
7
8
typedef void* BaseType;
 
typedef element *ptrel;
 
typedef  struct  {
    basetype* data;
    ptrel* next;
} element111;
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 14:55 #3
C++
1
2
3
4
5
6
7
8
9
typedef void* BaseType;
 
struct element;
typedef element *ptrel;
 
struct element {
    BaseType data;
    ptrel next;
};
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
попробуй как то так
Ой, гуру-гуру ...

0
ninja2
14.10.2013, 15:13
  #4

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Ой, гуру-гуру ...
Ну я не буду за него все явные ошибки исправлять, которые и так видно не вооруженным глазом, типо определил Basetype а записал basetype.

0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 15:21 #5
ninja2, да не в этом же дело. Про предварительное объявление слышал?
0
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:55 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
ninja2, да не в этом же дело. Про предварительное объявление слышал?
Да, а если у меня в классе есть методы ну например такой код:
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
#include <iostream>
using namespace::std;
 
class A;
 
class B
{
    A aa;
public:
    B(){aa.print();}
};
 
class A
{
public:
    void print(){cout <<"print A"<<endl;}
};
 
int main()
{
    B ab;
 
    return 0;
}
Как нам быть тогда???

Добавлено через 21 минуту
Ладно нужно через указатель делать, иначе компилятор ругается:
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
#include <iostream>
using namespace::std;
 
class B;
 
class A
{
    B* bb;
public:
    A();
    void print();
};
 
class B
{
    A* aa;
public:
    B();
    void print();
};
 
A::A(){bb->print();}
B::B(){aa->print();}
void B::print(){cout <<"print B"<<endl;}
void A::print(){cout <<"print A"<<endl;}
 
int main()
{
    B ab;
    A ba;
 
    return 0;
}
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 15:55 #7
Цитата Сообщение от ninja2 Посмотреть сообщение
Как нам быть тогда???
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
0
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:56 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 15:58 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
Сам же ответ знаешь.
Цитата Сообщение от ninja2 Посмотреть сообщение
Ладно нужно через указатель делать, иначе компилятор ругается:
0
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:59 #10
Нужно делать вначале объявление двух классов сначала с указателями не с объектами, а затем уче определять методы, тут ключевой момент именно через указаетли иначе будет выдавать ошибку типо использование класса без определения.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 16:41 #11
ninja2, если класс А включает в себя экземпляр (не ссылку или указатель) класса Б, а класс Б включает в себя экземпляр класса А, то такая ситуация неразрешима.
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 17:47 #12
Tulosba, Ну да.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
14.10.2013, 18:27 #13
Mike_device, Mike_device,
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
#include <iostream>
#include <windows.h>
using namespace std;
//использование тега в С-стиле (от struct до закрывающей фигурной }
typedef struct{
    int a;
    int b;
}
TypDefName;//это новое имя
//это в С++ выглядит:
struct UnTypDefName{
    int a;
    int b;
};
//вариация вслепую
typedef void* BaseType;
typedef  struct  Vasya{
    BaseType data;
    Vasya *self_point_ptr;
} element;
 
typedef element ptrel;
 
int main()
{
SetConsoleCP (1251); SetConsoleOutputCP (1251);
TypDefName struct_obj = { 1, 2};
UnTypDefName struct_another_obj ={3, 4};//то есть другой способ задания имени
//то есть Вы пытаетесь при помощи typedef определить имя element
//двумя разными типами
//при этом ещё один и не определён, но об этом сказали, хотя мне не понятно:
//что делать задумали?
cout<<endl;
system("pause"); 
    return 0;
    }
0
Tulosba
14.10.2013, 18:31
  #14

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
хотя мне не понятно: //что делать задумали?
это ж обычный односвязный список

0
IGPIGP
14.10.2013, 19:17
  #15

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
это ж обычный односвязный список
Так вот он какой... северный список? Теперь понятно, за что коэффициенты и надбавки. :yes:
Может и односвязный. Только необычный он кажется.:scratch:

0
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,329
Записей в блоге: 17
14.10.2013, 19:28 #16
Запутывать классы/структуры предобъявлениями само по себе не хорошо - нужно избегать такого...
1
14.10.2013, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 19:28

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.
Буду благодарен! Найти предельные значения для целочисленных типов. Не...

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов
Разработайте перегружены функции, в которые передаются два параметра типов int...


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

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

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