Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.10.2013, 14:44. Просмотров 571. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивное определение типов (C++):

Рекурсивное определение действия лекарств - C++
Реакция организма на действие лекарственного препарата через n часов после инъекции выражается показателем Rn. Экспериментально...

Определение границ типов данных - C++
Задача такова. Требуется определить максимальные границы для основных типов данных, т.е. int, double, char, float. Вот набросал, в...

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

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

Определение типов. Приведение int к unsigned int - C++
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно unsigned int? unsigned int n=5; ...

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

15
ninja2
231 / 187 / 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;
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.10.2013, 15:21 #5
ninja2, да не в этом же дело. Про предварительное объявление слышал?
0
ninja2
231 / 187 / 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;
}
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.10.2013, 15:55 #7
Цитата Сообщение от ninja2 Посмотреть сообщение
Как нам быть тогда???
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:56 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Переносишь класс А в начало и убираешь предварительное объявление. Оно вообще не нужно. Тут же нет взаимных ссылок.
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.10.2013, 15:58 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А если класс А использует класс B, а класс B использует класс А, как тогда нам быть???
Сам же ответ знаешь.
Цитата Сообщение от ninja2 Посмотреть сообщение
Ладно нужно через указатель делать, иначе компилятор ругается:
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 15:59 #10
Нужно делать вначале объявление двух классов сначала с указателями не с объектами, а затем уче определять методы, тут ключевой момент именно через указаетли иначе будет выдавать ошибку типо использование класса без определения.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.10.2013, 16:41 #11
ninja2, если класс А включает в себя экземпляр (не ссылку или указатель) класса Б, а класс Б включает в себя экземпляр класса А, то такая ситуация неразрешима.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.10.2013, 17:47 #12
Tulosba, Ну да.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6509 / 3146 / 307
Регистрация: 04.12.2011
Сообщений: 8,706
Записей в блоге: 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 Посмотреть сообщение
это ж обычный односвязный список
Так вот он какой... северный список? Теперь понятно, за что коэффициенты и надбавки.
Может и односвязный. Только необычный он кажется.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 19:17
Привет! Вот еще темы с ответами:

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

Рекурсивное сложение - C++
Дорогие друзья,объясните пожалуйста, если функция возвращает значение fib(n-1) + fib(n-2); при значении к примеру n=5,какой будет...

Рекурсивное вычисление - C++
Доброе время суток!!! Помогите пожалуйста решить две задачи с помощью рекурсии. За ранее огромное спасибо!!! Задача №1. Написать...

Рекурсивное наследование - C++
Доброго времени суток. Допустим, у нас есть файл fst.h: #include &lt;snd.h&gt; class Fst { Snd b; // Snd was not...


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

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

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