Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mike_device
3 / 3 / 3
Регистрация: 11.05.2013
Сообщений: 139
#1

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

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

Здравствуйте, у меня возникла проблема.
Есть код
C++
1
2
3
4
5
6
7
8
typedef void* BaseType;
 
typedef element *ptrel;
 
typedef  struct  {
    basetype data;
    ptrel next;
} element;
Суть такова, что тип element используется до определения. Причем избежать этого невозможно. Нужно заствать это работать. Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
230 / 186 / 7
Регистрация: 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;
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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 Посмотреть сообщение
попробуй как то так
Ой, гуру-гуру ...

ninja2
14.10.2013, 15:13
  #4

Не по теме:

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

Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 15:21     Рекурсивное определение типов #5
ninja2, да не в этом же дело. Про предварительное объявление слышал?
ninja2
230 / 186 / 7
Регистрация: 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;
}
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 15:55     Рекурсивное определение типов #7
Цитата Сообщение от ninja2 Посмотреть сообщение
Как нам быть тогда???
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:56     Рекурсивное определение типов #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 15:58     Рекурсивное определение типов #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
Сам же ответ знаешь.
Цитата Сообщение от ninja2 Посмотреть сообщение
Ладно нужно через указатель делать, иначе компилятор ругается:
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:59     Рекурсивное определение типов #10
Нужно делать вначале объявление двух классов сначала с указателями не с объектами, а затем уче определять методы, тут ключевой момент именно через указаетли иначе будет выдавать ошибку типо использование класса без определения.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 16:41     Рекурсивное определение типов #11
ninja2, если класс А включает в себя экземпляр (не ссылку или указатель) класса Б, а класс Б включает в себя экземпляр класса А, то такая ситуация неразрешима.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 17:47     Рекурсивное определение типов #12
Tulosba, Ну да.
IGPIGP
Комп_Оратор)
6362 / 3009 / 297
Регистрация: 04.12.2011
Сообщений: 8,099
Записей в блоге: 3
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;
    }
Tulosba
14.10.2013, 18:31
  #14

Не по теме:

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

IGPIGP
14.10.2013, 19:17
  #15

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 19:28     Рекурсивное определение типов
Еще ссылки по теме:

C++ Шаблоны, рекурсия, определение типов std::function
C++ Рекурсивное сложение
C++ Рекурсивное возведение в степень
Рекурсивное наследование C++
Рекурсивное копирование папок C++

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

Или воспользуйтесь поиском по форуму:
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
14.10.2013, 19:28     Рекурсивное определение типов #16
Запутывать классы/структуры предобъявлениями само по себе не хорошо - нужно избегать такого...
Yandex
Объявления
14.10.2013, 19:28     Рекурсивное определение типов
Ответ Создать тему
Опции темы

Текущее время: 15:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru