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

ошибка со ссылками на классы - C++

Восстановить пароль Регистрация
 
seva_phys
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 15
24.09.2012, 12:59     ошибка со ссылками на классы #1
всем привет
помогите разобраться пожалуйста!!!
пишу программу, где много объектов ссылается друг на друга. и все было хорошо

добавил очередной класс - с ним проблема. не могу понять в чем дело

уже существующий и работающий класс. методы не привожу
файл - Instrument.h
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
#pragma once
 
#include "Hyst_Read.h"
#include "In_Strategy.h"
 
class Instrument
{
public:
    Instrument(void);
    ~Instrument(void);
 
    In_Strategy * In_ST;
 
        bool Start_In_Strategy ();
};
 
в другом файле Instrument.cpp
bool Instrument::Start_In_Strategy ()
{
    
    In_ST = new In_Strategy (this);
 
 
    if ( In_ST == NULL)
        return (false);
 
    return (true);
добавляю класс
In_Strategy.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include "Instrument.h"
 
class In_Strategy
{
public:
    In_Strategy(Instrument *);
    ~In_Strategy(void);
 
       Instrument * Ins; 
};
 
в другом файле In_Strategy.cpp
#include "StdAfx.h"
#include "In_Strategy.h"
 
 
 
In_Strategy::In_Strategy(Instrument * I)
{
    Ins = I;
}



и вот такой результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
All outputs are up-to-date.
1>  Trade_Robot.cpp
1>c:\robot\trade_robot\trade_robot\in_strategy.h(7): error C2061: syntax error : identifier 'Instrument'
1>c:\robot\trade_robot\trade_robot\in_strategy.h(14): error C2143: syntax error : missing ';' before '*'
1>c:\robot\trade_robot\trade_robot\in_strategy.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\robot\trade_robot\trade_robot\in_strategy.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\robot\trade_robot\trade_robot\trade_robot.cpp(55): warning C4805: '==' : unsafe mix of type 'int' and type 'bool' in operation
1>  Instrument.cpp
1>c:\robot\trade_robot\trade_robot\instrument.cpp(5): error C2653: 'Instrument' : is not a class or namespace name
1>c:\robot\trade_robot\trade_robot\instrument.cpp(6): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\robot\trade_robot\trade_robot\instrument.cpp(7): warning C4508: 'Instrument' : function should return a value; 'void' return type assumed
1>c:\robot\trade_robot\trade_robot\instrument.cpp(10): error C2653: 'Instrument' : is not a class or namespace name
1>c:\robot\trade_robot\trade_robot\instrument.cpp(10): fatal error C1903: unable to recover from previous error(s); stopping compilation
1>  In_Strategy.cpp
1>c:\robot\trade_robot\trade_robot\instrument.h(28): error C2143: syntax error : missing ';' before '*'
1>c:\robot\trade_robot\trade_robot\instrument.h(28): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\robot\trade_robot\trade_robot\instrument.h(28): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 12:59     ошибка со ссылками на классы
Посмотрите здесь:

Классы, ошибка компиляции C++
Непонятно что за ошибка. Классы. C++
как создать классы с взаимными ссылками C++
Классы. Непонятная ошибка C++
C++ Классы - ошибка в деструкторе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 13:07     ошибка со ссылками на классы #2
по крайней мере косяк в том, что In_Strategy.h включает Instrument.h, а Instrument.h включает In_Strategy.h.
Такое вот циклическое или рекурсивное включение. хз как правильно.
попробуйте форвард декларацию:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
 
// #include "Instrument.h" это тут не надо. достаточно декларации
// инклуд нужен в cpp файле
 
class Instrument; //  вот она, форворд декларация
 
class In_Strategy
{
public:
    In_Strategy(Instrument *);
    ~In_Strategy(void);
 
       Instrument * Ins; 
};
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.09.2012, 13:12     ошибка со ссылками на классы #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
 #include "Hyst_Read.h"
 
class In_Strategy;
 
class Instrument
{
public:
    Instrument(void);
    ~Instrument(void);
 
    In_Strategy * In_ST;
 
    bool Start_In_Strategy ();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "In_Strategy.h"
bool Instrument::Start_In_Strategy ()
{
    
    In_ST = new In_Strategy (this);
 
 
    if ( In_ST == NULL)
        return (false);
 
    return (true);
}
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
class Insrtrument;
class In_Strategy
{
public:
    In_Strategy(Instrument *);
    ~In_Strategy(void);
 
       Instrument * Ins; 
};
C++
1
2
3
4
5
6
7
#include "In_Strategy.h" 
#include "Instrument.h"
 
In_Strategy::In_Strategy(Instrument * I)
{
    Ins = I;
}
Добавлено через 4 минуты
Тут цикличности не будет, есть инклюд гард. Проблема возникает при следующей ситуации:
хедер1 с классом класс1 подключает хедер2 с классом2. Класс1 агрегирует класс2, а класс2 агрегирует класс1. Соответственно получается такое:
C++
1
2
3
4
5
6
7
Class2{
Class1 cl; //это что еще такое? класс1 не был описан
};
 
Class1{
Class2 cl; //все хорошо класс описан
};
Как сказал DU здесь спасет форвард декларация.
seva_phys
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 15
24.09.2012, 13:42  [ТС]     ошибка со ссылками на классы #4
Спасибо большое!

тогда вопрос распадается на 2 части

1)
прописал декларацию в .h файле
C++
1
2
3
4
5
6
7
8
9
#pragma once
 
class Instrument;
 
class In_Strategy
{
public:
Instrument * Ins;
};
но в .cpp файле этого класса на все вызовы типа
C++
1
Ins->Hystory->DL->get_element_count()
ругается, и говорит, что неопределенный класс

C++
1
2
3
1>c:\robot\trade_robot\trade_robot\in_strategy.cpp(21): error C2027: use of undefined type 'Instrument'
1>          c:\robot\trade_robot\trade_robot\in_strategy.h(3) : see declaration of 'Instrument'
1>c:\robot\trade_robot\trade_robot\in_strategy.cpp(21): error C2227: left of '->Hystory' must point to class/struct/union/generic type



2) более широко. может есть другой метод решения?
из объекта класса A создается объект класса B, который должен содержать ссылку на объект класса A
это я и пытаюсь реализовать
есть какие-то другие методы?
наследование ваще никак, т.к. из объекта A еще много других объектов других классов создается, с разными свойствами. и ко всем им объект класса B должен иметь доступ
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.09.2012, 13:47     ошибка со ссылками на классы #5
И вообще лучше везде, где возможно использовать forward declaration, вместо включения заголовочного файла. Потому как любое изменение заголовочного файла приводит к перекомпиляции файлов, которые прямо либо опосредованно включают заголовочный файл.

Добавлено через 2 минуты
В файле реализации класса подключаете нужные уже вам заголовочные файлы.

Файл объявления in_strategy.h:
C++
1
2
3
4
5
6
7
8
9
#pragma once
 
class Instrument;
 
class In_Strategy
{
public:
Instrument * Ins;
};
Файл определения in_strategy.cpp:
C++
1
2
3
4
5
6
7
#include "In_Strategy.h"
#include "Instrument.h"
In_Strategy::In_Strategy(Instrument * I)
{
    Ins = I;
    Ins->Hystory->DL->get_element_count()
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 13:55     ошибка со ссылками на классы #6
ну да, как уже сказали, инклуд в спп файле забыли.
вот схемка примерно такая без лишнего кода.

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
37
38
39
40
41
42
43
44
45
46
47
48
//////////////////////////////////////
// Foo.h
class Bar
 
class Foo
{
  Bar* m_bar;
 
public:
  void FooFunc();
};
 
 
//////////////////////////////////////
// Bar.h
class Foo
 
class Bar
{
  Foo* m_foo;
 
public:
  void BarFunc();
};
 
 
//////////////////////////////////////
// Foo.cpp
#include "Foo.h"
#include "Bar.h"
 
void Foo::FooFunc()
{
  m_bar = new Bar();
  m_bar->BarFunc();
}
 
 
//////////////////////////////////////
// Bar.cpp
#include "Bar.h"
#include "Foo.h"
 
void Bar::BarFunc()
{
  m_foo = new Foo();
  m_foo->FooFunc();
}
Хоть при выполнении это и покрашится, суть здесь не в этом, а в том, чтобы показать как такие вещи делаются. Но еще стоит заметить, что такая ситуация кросс ссылок не есть хорошо с точки зрения дизайна. Возможно есть смысл перепроектировать все это хозяйство.
seva_phys
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 15
24.09.2012, 14:10  [ТС]     ошибка со ссылками на классы #7
спасибо огромное! заработало

Цитата Сообщение от DU Посмотреть сообщение

Хоть при выполнении это и покрашится, суть здесь не в этом, а в том, чтобы показать как такие вещи делаются. Но еще стоит заметить, что такая ситуация кросс ссылок не есть хорошо с точки зрения дизайна. Возможно есть смысл перепроектировать все это хозяйство.
по поводу переделать - в твоем примере A создает B, а В создает А.
у меня А создает B, C, D и т.д. И элемент B должен иметь доступ к С и Д.
Для этого я в B храню ссылку на A. Ну а в A уже есть ссылки на C, D и т.д.

или я тебя не так понял? поясни пожалуйста. важный момент - хочу разобраться

спасибо
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 14:33     ошибка со ссылками на классы #8
я не сказал что нужно передалать как у меня в примере.
в примере ситуация, когда первый класс нуждается во втором, а второй в первом.
примерно так же как и у тебя и пример лишь показывает как заставить это компилиться.
но вот и мой пример и твоя ситуация - это скорее всего признак плохого дизайна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 00:29     ошибка со ссылками на классы
Еще ссылки по теме:

C++ Ошибка в коде программы(Классы)
C++ абстрактные классы ошибка
C++ Классы (в чем ошибка?)

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

Или воспользуйтесь поиском по форуму:
seva_phys
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 15
25.09.2012, 00:29  [ТС]     ошибка со ссылками на классы #9
а как сделать форвардную декларацию для шаблона класса?

файл "Pisition_List.h"
C++
1
template <class T> class Position_List : public DynList <T>
далее в другом файле мне нужно объявить указатель на класс "Position_List"

понятно, можно сдеать
C++
1
 #include "Pisition_List.h"
а как через форвардную декларацию?
Yandex
Объявления
25.09.2012, 00:29     ошибка со ссылками на классы
Ответ Создать тему
Опции темы

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