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

Взаимный include без использования cpp-файлов - C++

Восстановить пароль Регистрация
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
10.07.2014, 02:45     Взаимный include без использования cpp-файлов #1
Возможно ли связать два класса реализованных в .h-файлах, чтобы не приходилось переносить реализацию в файлы cpp?

Эти 2 класса:
Object.h
C++
1
2
3
4
5
6
7
8
class Object {
public:
    virtual String getClassName() { /**/ }
    virtual String toString() { /**/ }
    virtual bool equals(Object& other) { /**/ }
    virtual String& operator+(String& str) final { /**/ }
    friend String& operator+(String& str, Object& object) { /**/ }
}
String.h
C++
1
2
3
4
5
class String : public Object {
public:
    virtual String toString() { return *this; }
    virtual bool equals(Object& other) { /**/ }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 02:45     Взаимный include без использования cpp-файлов
Посмотрите здесь:

C++ Создание cpp файлов
Архитектура размещения h и cpp файлов C++
Подключение файла #include <name.cpp> C++
C++ Библиотека (.h + .cpp) в папку include компилятора
C++ Обращение файлов cpp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roodey
4 / 4 / 1
Регистрация: 23.05.2013
Сообщений: 36
10.07.2014, 04:58     Взаимный include без использования cpp-файлов #2
Ну, для вызова этих модулей все-равно понадобится использование основного .cpp файла
Так что думаю, что нет, нельзя. Да и зачем?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
10.07.2014, 07:46     Взаимный include без использования cpp-файлов #3
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы не приходилось переносить реализацию в файлы cpp?
а причем здесь реализация?
они ссылаются друг на друга
да и чем плоха реализация в отдельном файле?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
10.07.2014, 08:15     Взаимный include без использования cpp-файлов #4
Странная какая-то у Вас иерархия классов.
Коли Object базовый класс, то он не может знать имени производного класса:
C++
1
2
3
4
5
6
7
8
class Object {
public:
    virtual Object& getClassName() { /**/ }
    virtual Object& toString() { /**/ }
    virtual bool equals(Object& other) { /**/ }
    virtual Object& operator+(Object& str){ /**/ }
    //friend Object& operator+(Object& str, Object& object) { /**/ }
}
А в производном классе перегружаете все эти методы и вызываете как виртуальные - по ссылке или указателю.
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
10.07.2014, 08:41     Взаимный include без использования cpp-файлов #5
Можно. Пиши реализацию в заголовочных файлах там где у тебя комментарии.
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
10.07.2014, 08:54     Взаимный include без использования cpp-файлов #6
а компилятор не зациклится от того что два файла ссылаются друг на друга?
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,215
10.07.2014, 09:54     Взаимный include без использования cpp-файлов #7
Цитата Сообщение от Kukurudza Посмотреть сообщение
а компилятор не зациклится от того что два файла ссылаются друг на друга?
зацикливается. include guard http://ru.wikipedia.org/wiki/Include_guard помогает решить эту проблему
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
10.07.2014, 12:03  [ТС]     Взаимный include без использования cpp-файлов #8
Цитата Сообщение от Roodey Посмотреть сообщение
Ну, для вызова этих модулей все-равно понадобится использование основного .cpp файла
Ну это само собой понятно. Просто имел в виду, чтобы не приходилось создавать Object.cpp и String.cpp с реализацией методов (Все решения в интернете подразумевают перенос реализации в cpp). Ибо очень много неудобно будет.
Цитата Сообщение от zss Посмотреть сообщение
Странная какая-то у Вас иерархия классов.
Коли Object базовый класс, то он не может знать имени производного класса
А почему? В Java такое работает.

Цитата Сообщение от castaway Посмотреть сообщение
Можно. Пиши реализацию в заголовочных файлах там где у тебя комментарии.
Как? Компилятор ругается в Object.h на строчках где есть String, что ничего не знает про этот String
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
10.07.2014, 12:24     Взаимный include без использования cpp-файлов #9
Я не имел в виду твой не рабочий вариант, я имею в виду что вообще это возможно.
Твой вариант не будет работать даже в .cpp модулях. Исправляй ошибки о которых уже сказали и пиши реализацию в заголовочных файлах.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
10.07.2014, 14:49     Взаимный include без использования cpp-файлов #10
Цитата Сообщение от castaway Посмотреть сообщение
и пиши реализацию в заголовочных файлах.
можно спросить? Зачем?
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
10.07.2014, 15:29     Взаимный include без использования cpp-файлов #11
Спроси у ТС. Это ведь ему нужно. Я лишь говорю что это возможно.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
10.07.2014, 16:33     Взаимный include без использования cpp-файлов #12
Цитата Сообщение от castaway Посмотреть сообщение
Спроси у ТС.
ТС не понимает куда ввязывается
написать один файл, немножко долго
но гораздо проще чем вылавливать ошибки линковки
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
10.07.2014, 16:48     Взаимный include без использования cpp-файлов #13
Цитата Сообщение от QGuest Посмотреть сообщение
class Object
class String : public Object
virtual bool equals(Object& other) { /**/ }
ООП головного мозга
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
10.07.2014, 16:50     Взаимный include без использования cpp-файлов #14
Я не люблю когда меня кто-то чему-то учит без моего желания, навязывает своё мнение. Ты любишь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 19:10     Взаимный include без использования cpp-файлов
Еще ссылки по теме:

Удалить числа из файла, без использования дополнительных массивов и файлов C++
C++ Несколько cpp файлов в проекте
Условное подключение cpp файлов C++

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

Или воспользуйтесь поиском по форуму:
EVP
314 / 236 / 41
Регистрация: 14.12.2010
Сообщений: 457
10.07.2014, 19:10     Взаимный include без использования cpp-файлов #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от QGuest Посмотреть сообщение
Ну это само собой понятно. Просто имел в виду, чтобы не приходилось создавать Object.cpp и String.cpp с реализацией методов (Все решения в интернете подразумевают перенос реализации в cpp). Ибо очень много неудобно будет.
Это специфика C++.

Цитата Сообщение от QGuest Посмотреть сообщение
Сообщение от zss
Странная какая-то у Вас иерархия классов.
Коли Object базовый класс, то он не может знать имени производного класса

А почему? В Java такое работает.
В C++ тоже работает:
Кликните здесь для просмотра всего текста
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
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string>
 
//{{Object.h
class String;
class Object {
public:
    virtual String getClassName();
    virtual String toString();
    virtual bool equals(const Object& other);
};
//}}Object.h
 
//{{String.h
class String : public Object {
private:
    std::string value;
public:
    String(const std::string& _value):value(_value){}
    virtual String toString() override { return *this; }
    virtual bool equals(const Object& other) override{
        const String* obj = dynamic_cast<const String*>(&other);
        return (obj != nullptr) ? value == obj->value : Object::equals(other);
    }
 
    const std::string& getValue()const{ return value; }
    void setValue(const std::string& _value){ value = _value; }
 
    String operator+(const String& _value){ return String(value + _value.value); }
};
//}}String.h
 
//{{Object.cpp
String Object::getClassName() { return typeid(*this).name(); }
String Object::toString() { return std::to_string((int)this); }
bool Object::equals(const Object& other) { return this == &other; }
std::ostream& operator<< (std::ostream& stream, Object& obj)
{
    return stream << obj.toString().getValue();
}
//}}Object.cpp
 
int main()
{
    String s1("string 1");
    String s2("string 2");
    String s12(s1 + s2);
    Object o1;
 
#define PRINT_EQUALS(_s1,_s2) \
    std::cout << "\"" << _s1 << "\"" << ".equals(" << _s2 << ") ?= " << (_s1.equals(_s2)) << std::endl
 
    PRINT_EQUALS(s1, s2);
    PRINT_EQUALS(s1, s1);
    PRINT_EQUALS(s1, o1);
    PRINT_EQUALS(s12, s1+s2);
}


В данном случае порядок должен быть такой:

Обычно в *.h:
1. Объявление класса String. ( class String; )
2. Определение класса Object.
3. Определение класса String.
В определениях классов по разным причинам желательны только объявления методов и данных.

Обычно в *.cpp:
4. Определение методов класса Object;
5. Определение методов класса String;

Определение методов Object будет использовать определение класса String.
Если определение такого метода совместить с объявлением метода внутри определения класса Object,
то возникнет ошибка, т.к. доступно будет лишь объявление класса String, но не его определение.
Следовательно, его структура класса String неизвестна компилятору C++.
Поэтому определение методов выносится в файлы *.cpp,
где все определения классов будут доступны из заголовков (*.h файлов).

Компилятор Java способен откладывать компиляцию определений методов до полного определения классов,
поэтому там такой проблемы нет и разделение на *.h и *.cpp не нужно.
Yandex
Объявления
10.07.2014, 19:10     Взаимный include без использования cpp-файлов
Ответ Создать тему
Опции темы

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