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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
#1

Предварительное объявление классов. Вызвать функцию до реализации класса - C++

05.01.2014, 22:36. Просмотров 2574. Ответов 25
Метки нет (Все метки)

Приветствую, народ.
Пытаюсь реализовать структуру типа патерна "Посредник". И при реализации взаимодействий возникла проблемка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class B;
 
class A {
public:
    B* b;
    void foo(){
        b->foo(); //Вот здесь проблема.
    }
};
 
class B {
public:
    A a;
    void foo(){ 
    }
};
 
int main(){
    B bb = B();
    bb.a.foo();
    return 0;
}
На указанной строке компилятор говорит, что он не может найти реализацию функции.
Может кто-то подсказать, как добиться того, чтобы можно было вызвать функцию до реализации класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 22:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Предварительное объявление классов. Вызвать функцию до реализации класса (C++):

Предварительное объявление класса - C++
Имеется код такого вида: class IBase { public: virtual foo() = NULL; .. .. .. };

Предварительное объявление для класса, помещенного в простанство - C++
Пытаюсь сделать forward declaration для библиотечного класса ostream помещенного в namespace std. Код ниже не катит. Как делается...

Два класса в одном заголовочном файле, предварительное объявление - C++
Дико туплю, никак не могу понять, где косячу. Ситуация - есть два описания классов в одном заголовочном файле (все делается с...

Объявление класса без его реализации - C++
Добрый день! Я (вроде бы) знаю как объявлять класс, не подключая его в хедере class MyClass; ... public: myFunc(MyClass);

Предварительное объявление - C++
Добрый вечер, Есть файл file.h и file.cpp, в file.cpp я делаю подключение #include <boost/signal.hpp>, не подключаю в хэдер file.h...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? - C++
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и вызывается в его конструкторе (камень...

25
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
05.01.2014, 23:48  [ТС] #16
Цитата Сообщение от ValeryS Посмотреть сообщение
я так понял что ТС и описания и реализацию запихивает в один файл
тогда это действительно некрасиво
плюс еще если реализация в заголовочном файле, и его подключить несколько раз
то можно получить ошибку линковщика
а так с разделением по файлам и красиво и проблемы уйдут
Здесь был просто упрощенный пример. В реальности архитектура выглядит так [Названия классов тестовые]
C++
1
2
//Global.h
class B;
C++
1
2
3
4
5
6
7
8
//A.h
#include "Global.h"
 
class A {
public:
    B* b;
    void foo();
};
C++
1
2
3
4
5
6
7
//A.cpp
#include "A.h"
 
void A::foo()
{
     b->foo(); //Вот здесь проблема.
}
C++
1
2
3
4
5
6
7
8
//B.h
#include "A.h"
 
class B {
public:
    A a;
    void foo();
};
C++
1
2
3
4
5
//B.cpp
#include "B.h"
void B::foo()
{
}
Почти не читаймо, для быстрого вникания.
Собственно, вот именно такая штука не работала.
В итоге нужно было добавить строку в "A.cpp"
C++
1
2
3
4
//A.cpp
#include "A.h"
#include "B.h"
...
И вот так заработало.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
05.01.2014, 23:55 #17
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
И вот такая штука не работала.
В итоге нужно было добавить строку в "A.cpp"
так сразу бы так и говорил
разумеется ошибка будет поскольку "A.cpp" ничего не знал про класс B, и справедливо ругался.
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
И вот так заработало.
а так узнал
include это такой макрос который весь текст который есть в файле, указанном, переносит заместо себя
ты мог вместо
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
C++
1
2
#include "A.h"
#include "B.h"
написать
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
class B;
class A {
public:
 B* b;
 void foo();
};
class B {
public:
 A a;
 void foo();
};
и все бы сработало
но согласись, это глупо
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
05.01.2014, 23:56 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
плюс еще если реализация в заголовочном файле, и его подключить несколько раз
то можно получить ошибку линковщика
Смотря как реализовать всё это дело
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
05.01.2014, 23:59 #19
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря как реализовать всё это дело
если в заголовочном файле есть реализация, и он подключается к разным единицам трансляции ( читай, С-файлы)
то как не реализуй линковщик с ума сойдет, не зная какую реализацию выбрать
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:00 #20
ValeryS, попробуйте подключить в разных модулях это:
C++
1
2
3
4
5
6
7
8
9
class A {
public:
    void inline bar ( const char * str ) ;
} ;
 
 
void A::bar ( const char * str ) {
    std::cout << str <<std::endl ;
}
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
06.01.2014, 00:04 #21
Цитата Сообщение от Croessmah Посмотреть сообщение
void inline
про инлайн уговора не было
это вообще не функция, с низкой точки зрения, а,считай, тот же макрос, подставляет свой код вместо вызова
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:05 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
про инлайн уговора не было
да мы вообще ни о чем не договаривались
но факт остается фактом - реализовать можно и в заголовке, но получится ерунда в результате
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
06.01.2014, 00:10 #23
кстати inline это не приказ, а так пожелание, компилятор может запросто не вставлять код а создать обычную функцию.
раньше такое было если в теле функции присутствовал цикл, компилятор не инлайнил функцию а создавал отдельно, как сейчас не знаю
так что и с inline можно нарваться

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
но факт остается фактом - реализовать можно и в заголовке
можно, но нежелательно
Цитата Сообщение от Croessmah Посмотреть сообщение
но получится ерунда в результате
об чем я и говорил
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:12 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
как сейчас не знаю
а сейчас, если не тыкать компилятор носом куда следует, то он встроит что сочтет нужным, даже то, что не объявлено как inline, ну или вообще функцию из другого модуля... эпоха оптимизирующих компиляторов настала. Ждем эру компиляторов-самописцев, которые будут писать заданную программу по желанию пользователя
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
06.01.2014, 00:22 #25
Цитата Сообщение от Croessmah Посмотреть сообщение
то он встроит что сочтет нужным, даже то, что не объявлено как inline,
то что реализовано внутри описания класса, считается inline "по умолчанию"
т.е
C++
1
2
3
4
5
6
7
8
9
class A {
public:
    void inline bar ( const char * str ) ;
} ;
 
 
void A::bar ( const char * str ) {
    std::cout << str <<std::endl ;
}
и
C++
1
2
3
4
class A {
public:
    void  bar ( const char * str ){  std::cout << str <<std::endl ;} ;
} ;
это одно и тоже
Цитата Сообщение от Croessmah Посмотреть сообщение
ну или вообще функцию из другого модуля...
дозвольте, не поверить
оптимизация внутри модуля это еще нормально
а оптимизировать все чохом, это сколько ж ресурсов нужно
представь прога из 100 модулей, правишь один
компилируешь
и тогда компилятор должен все оставшиеся 99 модулей перекомпилировать, создать дерево и оптимизировать
Цитата Сообщение от Croessmah Посмотреть сообщение
Ждем эру компиляторов-самописцев,
Эх-х-х, житуха настанет
скорей бы
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:30 #26
Цитата Сообщение от ValeryS Посмотреть сообщение
дозвольте, не поверить
оптимизация внутри модуля это еще нормально
а оптимизировать все чохом, это сколько ж ресурсов нужно
обо всем уже писали. Вот почитайте тему реализация класса в .h файле хорошо или плохо?

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
то что реализовано внутри описания класса, считается inline "по умолчанию"
я про то, что даже если вы напишите функцию
C++
1
2
3
void foo ( ) {
//...
}
то компилятор может её встроить, если сочтет нужным
0
06.01.2014, 00:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2014, 00:30
Привет! Вот еще темы с ответами:

Как вызвать функцию родительского класса? - C++
#include &lt;iostream&gt; using namespace std; class foo{ void somefunc(); public: int i; };

Как создать указатель на функцию-член класса и вызвать его? - C++
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Спрятать указатель на функцию класса в map и вызвать из другого объекта - C++
Товарищи, пишу примитивный &quot;tcp-сервер&quot;. В его задачи входит принятие соединений и получение сообщений. В зависимости от сообщения &quot;сервер&quot;...

Как вызвать функцию-член правильно для класса Person - C++
Задача простая, ввести фамилию и имя и вывести их. Подскажите, как правильно написать функцию вывода print(). Если один параметр...


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

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

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