Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
Russian_Dragon
10 / 11 / 2
Регистрация: 18.02.2012
Сообщений: 140
#1

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

05.01.2014, 22:36. Просмотров 3240. Ответов 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
Ответы с готовыми решениями:

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

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

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

Объявление класса без его реализации
Добрый день! Я (вроде бы) знаю как объявлять класс, не подключая его в...

Предварительное объявление
Добрый вечер, Есть файл file.h и file.cpp, в file.cpp я делаю подключение...

25
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,344
06.01.2014, 00:04 #21
Цитата Сообщение от Croessmah Посмотреть сообщение
void inline
про инлайн уговора не было
это вообще не функция, с низкой точки зрения, а,считай, тот же макрос, подставляет свой код вместо вызова
0
Croessmah
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:05 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
про инлайн уговора не было
да мы вообще ни о чем не договаривались
но факт остается фактом - реализовать можно и в заголовке, но получится ерунда в результате
0
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,344
06.01.2014, 00:10 #23
кстати inline это не приказ, а так пожелание, компилятор может запросто не вставлять код а создать обычную функцию.
раньше такое было если в теле функции присутствовал цикл, компилятор не инлайнил функцию а создавал отдельно, как сейчас не знаю
так что и с inline можно нарваться

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
но факт остается фактом - реализовать можно и в заголовке
можно, но нежелательно
Цитата Сообщение от Croessmah Посмотреть сообщение
но получится ерунда в результате
об чем я и говорил
0
Croessmah
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 3
Завершенные тесты: 1
06.01.2014, 00:12 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
как сейчас не знаю
а сейчас, если не тыкать компилятор носом куда следует, то он встроит что сочтет нужным, даже то, что не объявлено как inline, ну или вообще функцию из другого модуля... эпоха оптимизирующих компиляторов настала. Ждем эру компиляторов-самописцев, которые будут писать заданную программу по желанию пользователя
0
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,344
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
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 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

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

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

Вызвать функцию класса без создания объекта
Можно ли так сделать? Точнее я знаю что можно, но у меня не получается, я хочу...


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

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

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