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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ При помощи структуры ввести имена и оклады троих сотрудников http://www.cyberforum.ru/cpp-beginners/thread1225279.html
Суть задачи - при помощи структуры ввести имена и оклады троих сотрудников а потом вывести их данные на экран. написанное мною работает неверно. скажите, где ошибка? #include "stdafx.h" #include <iostream> using namespace std; struct employee { char empl;
C++ Fatal error LNK1120: неразрешенных внешних элементов: 11 Добрый вечер, нужно написать программу, которая бы запускала виртуальную машину(WMware), делала снэпшот и откатывала до предыдущего состояния. Проштудировав документацию WMware API, я нашел уже реализованную программу. /* ********************************************************************* * Copyright (c) 2007 VMware, Inc. * All rights not expressly granted to you by VMware, Inc. are... http://www.cyberforum.ru/cpp-beginners/thread1225278.html
Тестирование, вывод результатов C++
Доброго времени суток! у меня такой вопрос есть тест в котором нужно выбирать один из двух вариантов ответов либо А либо Б всего 20 пар как сделать правильно вывод Так выглядит Ключ к выводу результатов
C++ Открытие файлов Netcdf
Добрый день,уважаемые коллеги! У меня возникла следующая проблема. У меня есть несколько файлов вида NetCDF (которые,как известно,имеют расширение .nc). Открыть их можно разными способами, но мне это крайне желательно сделать с помощью языка С++. Собственно говоря как код, так и и тестовый файл располагается на данном ресурсе. Я попытался просто скачать и запустить программу и мне выдалось сразу...
C++ Выведите массив на экран и найдите количество элементов, значение которых равно нулю http://www.cyberforum.ru/cpp-beginners/thread1225227.html
"Данный двухмерный массив размерностью 5X4. Заполните его случайными числами с интервала -20 .. 20: 1. Выведите массив на экран и найдите количество элементов, значение которых равно нулю. 2. Найдите среднее арифметическое значение каждой строки. 3. Найдите максимальное и минимальное значения матрицы. 4. Вывести на экран элементы указанного пользователем строки или указанного...
C++ Как работает Cin.ignore() Дочитал до главы "Потоки и файлы" и с первого примера началось не понимание. Вот пример: #include <iostream> using namespace std; int main() { setlocale(0, "Rus"); подробнее

Показать сообщение отдельно
EVP
314 / 236 / 41
Регистрация: 14.12.2010
Сообщений: 457
10.07.2014, 19:10     Взаимный include без использования cpp-файлов
Цитата Сообщение от 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 не нужно.
 
Текущее время: 05:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru