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

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

Войти
Регистрация
Восстановить пароль
 
 
Volrajas
Заблокирован
#1

Циклическая ссылка h-ников, что делать? - C++

22.10.2015, 10:18. Просмотров 329. Ответов 16
Метки нет (Все метки)

есть два h-ника ссылающиеся друг на друга, дело в том что в них есть классы использующие друг друга (переменные в классах), поэтому они должны ссылаться друг на друга, в итоге куча ошибок компиляции... #pragma once подключено везде где только можно, но это не помогает что делать?

Добавлено через 8 минут
например

Header.h
C++
1
2
3
4
5
6
7
8
#pragma once
#include "Header1.h"
 
class B
{
public:
    A a;
};
Header1.h
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
#include "Header.h"
 
class A
{
public:
    // Ошибка   C3646   b: неизвестный спецификатор переопределения
    // Ошибка   C4430   отсутствует спецификатор типа - предполагается int.
    B b;
};
Source.cpp
C++
1
2
3
4
5
6
7
#pragma once
#include "Header.h"
#include "Header1.h"
 
int main()
{
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2015, 10:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Циклическая ссылка h-ников, что делать? (C++):

Что делать с этой ошибкой: "LNK2019: ссылка на неразрешенный внешний символ _WinMain@16"? - C++
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции...

подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать - C++
Вывод В выходной файл выведите одно число - сколько ударов сделали часы за этот отрезок времени.

сообщение что исходный файл не откомпилирован что делать? - C++
Собственно скачал я dev c++ пишу простую программу #include <iostream> int main() { std::cout << "Hello world!"; ...

Что мне делать или что надо знать перед тем как начать изучение яз.программирования С/С++? - C++
Я пока вообще не умею программировать.Сначала хотел с бейсика или паскаля.Но многие советуют начинать сразу с С/С++.

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы - C++
Заранее спасибо.

Что делать?(учу C++ и кое что ни понимаю может стоит начать с более "низких языков" например basic) - C++
Всем привет народ вот я учу C++ и кое что ни понимаю может стоит начать с более "низких языков" например basic?

16
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:18 #2
Используйте предварительное объявление класса
C++
1
2
3
4
5
6
class B;
 
class A
{
  B* pb;// теперь можно объявлять указатели и/или ссылки на класс B
};
Естественно, нельзя создавать экземпляр класса B b; Это будет ошибкой, т.к. B->A->B->A и т.д. зациклимся
0
Volrajas
Заблокирован
22.10.2015, 10:20  [ТС] #3
zss, а как то по другому можно? не удобно же... да и все равно ошибку выдает:
Ошибка C2079 "A::b" использует неопределенный class "B"
0
hoggy
6646 / 2832 / 485
Регистрация: 15.11.2014
Сообщений: 6,257
Завершенные тесты: 1
22.10.2015, 10:23 #4
C++
1
2
3
4
5
6
7
#pragma once
 
class B
{
public:
    A a;
};
C++
1
2
3
4
5
6
7
#pragma once
 
class A
{
public:
    B b;
};
C++
1
2
3
4
5
6
7
#pragma once
#include "Header.h"
#include "Header1.h"
 
int main()
{
}
Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
B* pb;// теперь можно объявлять указатели и/или ссылки на класс B
и ещё теперь на один унылый костыль стало больше.

не нужно делать форварды там,
где предметная область такова,
что классы должны знать друг о друге.
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:23 #5
Еще раз, надо B* b; УКАЗАТЕЛЬ!!!!!!
0
Volrajas
Заблокирован
22.10.2015, 10:24  [ТС] #6
hoggy, эмм ну и? взяли мой код, убрали инклуды, а откуда по вашему первый h-ник узнает о существовании класса A, а второй B?

Добавлено через 35 секунд
Цитата Сообщение от zss Посмотреть сообщение
Еще раз, надо B* b; УКАЗАТЕЛЬ!!!!!!
а мне не надо указатель, мне надо объект
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:24 #7
hoggy, Использование указатель не требует знания классов друг о друге.
0
hoggy
6646 / 2832 / 485
Регистрация: 15.11.2014
Сообщений: 6,257
Завершенные тесты: 1
22.10.2015, 10:24 #8
Цитата Сообщение от zss Посмотреть сообщение
Еще раз, надо B* b; УКАЗАТЕЛЬ!!!!!!
ещё раз - костыли не нужны.
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:24 #9
Объект создавайте в конструкторе!
А лучше объясните, что Вы хотите от этих классов.
У меня подозрение, что на самом деле Вам нужно наследование с виртуальными функциями.
0
Volrajas
Заблокирован
22.10.2015, 10:28  [ТС] #10
Цитата Сообщение от zss Посмотреть сообщение
Объект создавайте в конструкторе!
Ошибка C2512 B: нет подходящего конструктора по умолчанию

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
А лучше объясните, что Вы хотите от этих классов.
У меня подозрение, что на самом деле Вам нужно наследование с виртуальными функциями.
ванга мод активейтед? нет, наследование мне не нужно
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:28 #11
Объясните, что Вы хотите от этих классов.
0
Volrajas
Заблокирован
22.10.2015, 10:29  [ТС] #12
Цитата Сообщение от zss Посмотреть сообщение
Объясните, что Вы хотите от этих классов.
ничего не буду объяснять это секрет, вам это не обязательно знать чтобы помочь мне
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:31 #13
Ну тогда мне и не обязательно помогать Вам...
Вот пример инициализации через конструктор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B;
 
class A
{  
    B* pb;
public:
  A(B* t){pb=t;}
};
class B
{
    int x;
public:
    B(int k):x(k){}
};
int main ()
{
    B b(777);
    A a(&b);
}
0
Volrajas
Заблокирован
22.10.2015, 10:42  [ТС] #14
Цитата Сообщение от zss Посмотреть сообщение
Ну тогда мне и не обязательно помогать Вам...
ну и не помогайте блин, чего тогда вообще заходили

Добавлено через 10 минут
Цитата Сообщение от zss Посмотреть сообщение
Вот пример инициализации через конструктор
так это же уже вообще другое, у вас нету в классе B переменной типа A...
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
22.10.2015, 10:54 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class B;
 
class A
{  
    B* pb;
public:
  A(B* t){pb=t;}
};
class B
{
    A* pa;
    int x;
public:
    B(int k,A* t):x(k){pa=t;}
};
int main ()
{
    A* tmp;
    B b(777,tmp);
    A a(&b);
}
Или скорее так:
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
#include<math.h>
#include<conio.h>
#include<stdio.h>
class B;
 
class A
{  
    B* pb;
public:
    A():pb(NULL){}
  A(B* t){pb=t;}
};
class B
{
    A* pa;
    int x;
public:
    B(int k,A*& t):x(k){pa=new A;t=pa;}
};
int main ()
{
    A* tmp;
    B b(777,tmp);
// теперь tmp адресует b.pa
     A a(&b);
}
Но опять-таки - это экстрасенсорные предположения о том, что Вы хотите от такого странного кода
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2015, 10:54
Привет! Вот еще темы с ответами:

Что содержит ссылка? - C++
Почитал в нескольких местах. Везде одно и то же: &quot;ссылка - это псевдоним&quot;. Интересно, а она вообще является отдельной переменной? То есть: ...

Ребят Незнаю что делать при запуске на компилирование выдает ошибку.Кто понимает что не так скажите а если не затруднит исправьте ошибку - C++
Разговаривал с двумя преподами говорят что проект не правильно создавал,хотя все правильно из группы спрашивал у парней говорят что не...

что делать? - C++
ребята помогите решить задачу :) Даны вещественные массивы А,B определить значения вещественного массива С по правилу : С=cумме...

что делать? - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;string.h&gt; #include &quot;iostream&quot; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.10.2015, 10:54
Ответ Создать тему
Опции темы

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