Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопросы по С++ / 25 сообщений из 33, страница 1 из 2
30.05.2015, 22:32
    #38972511
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Возникло несколько вопросов по С++. Я новичёк, поэтому и вопросы соответствующие.
1. Есть ли новые изменения в языке, кроме стандартов С++11 и С++14?
2. Зачем нужно метапрограммирование в шаблонах, кроме как для теоретического интереса?
3. Чем отличается файл .hpp от .cpp и .h?
4. Почему С++ до сих пор не превратится в кроссплатформенный и многосистемный, как Java и C#?
5. Чем отличается программирование на C++ для Linux от программирования для Windows?
...
Рейтинг: 0 / 0
30.05.2015, 22:37
    #38972512
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Ответы:
1. А их тебе мало?..
2. Низачем.
3. Обычно .hpp это пре-компилированный заголовок.
4. Превратился и уже давно.
5. Ничем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.05.2015, 23:12
    #38972519
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Dimitry Sibiryakov3. Обычно .hpp это пре-компилированный заголовок.
Штоа? :)
Это просто заголовок, такой же как и .h, только там декларации С++.
...
Рейтинг: 0 / 0
31.05.2015, 07:33
    #38972578
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cpp,

не скажу, что ответы коллег неправильные, просто хочу подчеркнуть кое-какие аспекты.

1. Есть ли новые изменения в языке, кроме стандартов С++11 и С++14?

нет. все изменения в стандарте.

2. Зачем нужно метапрограммирование в шаблонах, кроме как для теоретического интереса?


а что ты понимаешь под метапрограммированием ?

3. Чем отличается файл .hpp от .cpp и .h?


ничем.
ты можешь делать #include файла с абсолютно любым суффиксом.

4. Почему С++ до сих пор не превратится в кроссплатформенный и многосистемный, как Java и C#?

он таким всегда был с рожднния.

5. Чем отличается программирование на C++ для Linux от программирования для Windows?

на стандартном с++ программирование не отличается ничем.
но часто программы используют API операционной системы и графических библиотек для своей работы. Тут дело скорее не в ОС, а в том, какие библиотеки используются. Библиотеки бывают переносимые и специфичные для конкретных ОС.
...
Рейтинг: 0 / 0
31.05.2015, 12:27
    #38972632
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Спасибо всем, кто ответил.


MasterZiv,

наверное, не совсем правильно выразился. Зачем нужны вычисления до компиляции на основе шаблонов?
Правильно я понял, что написав код, не использующий специфические библиотеки для windows, спокойно откомпилируется и будет работать в других ОС и в системах с большей/меньшей разрядностью?
...
Рейтинг: 0 / 0
31.05.2015, 15:57
    #38972709
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Вопрос номер 2 - сложен и требует уточнений.
...
Рейтинг: 0 / 0
31.05.2015, 16:10
    #38972714
Вопросы по С++
code_cppнаверное, не совсем правильно выпазился. Зачем нужны вычисления до компиляции на основе шаблонов?

Я не очень понимаю, что есть "вычисления до компиляции"

С шаблонами игрался очень давно (в конце 90-х, на Borland C 3.x ) - жутко не понравилось, как они были реализованы. В целом хорошую идею загубили реализацией. Тогда, фактически, шаблоны разворачивались a la макрос. При наличие ошибок, искать их было убийственно.

Ну и тогда же читал книжку Страуструпа, во второй части книги он свои примеры реализации ряда классов показывал. Лично я половину его классов нафига не понял (на мой взгляд, очень многое было не ООП'шно и коряво).

code_cppПравильно я понял, что написав код, не использующий специфические библиотеки для windows, спокойно откомпилируется и будет работать в других ОС и в системах с большей/меньшей разрядностью?
При соблюдении ряда правил - да

При использовании побитовых операций и сдвига, можно получиться зависимость от разрядности. В свое время (80-е) издавалась тоненькая книжечка Корнига с Ричем - там 50% было посвящено именно написанию переносимого кода. Для большей/меньшей разрядности, порядка байт в слове и так далее.

В свое время потребовалось переносить пару своих проектов на C и Java на Linux (до того работал только с Windows). Как не парадоксально, C код смигрировал за день, а с Java кодом проблем было намного больше )))
...
Рейтинг: 0 / 0
31.05.2015, 16:34
    #38972719
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cpp,

Зачем нужны вычисления до компиляции на основе шаблонов?

вполне очевидно, чтобы перенести какие-то вычисления на момент компиляции.
но это достаточно редко бывает на практике.
...
Рейтинг: 0 / 0
31.05.2015, 16:37
    #38972720
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cpp,

Правильно я понял, что написав код, не использующий специфические библиотеки для windows, спокойно откомпилируется и будет работать в других ОС и в системах с большей/меньшей разрядностью?

спокойно откомпилируется - да, если все используемые библиотеки переносимые.
но для каждой платформы программу надо собирать заново.
...
Рейтинг: 0 / 0
31.05.2015, 17:10
    #38972727
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cpp2. Зачем нужно метапрограммирование в шаблонах, кроме как для теоретического интереса?
Назначение шаблонов - генерация кода (также известная как метапрограммирование).
Как и любой другой процесс, это требует анализа условий и принятия решений, для чего служат ветвления, рекурсия и прочее.
Шаблоны предоставляют возможности для реализации всего этого в момент генерации кода (при компиляции).
Это ответ на вопрос "Зачем?"
...
Рейтинг: 0 / 0
31.05.2015, 18:02
    #38972744
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Кудрявцев_ЛеонидВ свое время потребовалось переносить пару своих проектов на C и Java на Linux (до того работал только с Windows). Как не парадоксально, C код смигрировал за день, а с Java кодом проблем было намного больше )))
А какие именно проблемы были с Java-linux миграцией?

Просто любопытно.
...
Рейтинг: 0 / 0
31.05.2015, 19:01
    #38972770
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Я сделал опечатку: вычисления не до компиляции, а до выполнения, но во время компиляции.
Под вычислениями я имею ввиду не то, когда из ClassA<T> получаются разные классы ClassA<double> и ClassA<int>, а когда на этапе компиляции делаются вполне конкретные вычисления, например, вычисляется сумма арифметической прогрессии или факториал.

вполне очевидно, чтобы перенести какие-то вычисления на момент компиляции.
Можете привести пример?

Вопрос по-прежнему в силе: когда такие вычисления во время компиляции очень помогают/упрощают жизнь?
...
Рейтинг: 0 / 0
31.05.2015, 19:03
    #38972771
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Под метапрограммированием я понимаю вычисления на основе хитростей с шаблонами (вычисление факториала и т.д.). Возможно, моё понимание ошибочно.
...
Рейтинг: 0 / 0
31.05.2015, 21:21
    #38972831
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppЯ сделал опечатку: вычисления не до компиляции, а до выполнения, но во время компиляции.
Под вычислениями я имею ввиду не то, когда из ClassA<T> получаются разные классы ClassA<double> и ClassA<int>, а когда на этапе компиляции делаются вполне конкретные вычисления, например, вычисляется сумма арифметической прогрессии или факториал.

вполне очевидно, чтобы перенести какие-то вычисления на момент компиляции.
Можете привести пример?

Вопрос по-прежнему в силе: когда такие вычисления во время компиляции очень помогают/упрощают жизнь?

не могу привести пример. я сам это не использовал никогда. У меня есть приятель, бывший коллега, они использовали как раз для вычисления факториалов для вычисления размеров массивов, кажется.
я могбы предложить, что какие то вещи для кросс платформенности можно на этом делать.
...
Рейтинг: 0 / 0
31.05.2015, 21:37
    #38972839
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
MasterZiv,

Так тут же пишут, что C++ и так кроссплатформенный, если не считать побитовые операции.
...
Рейтинг: 0 / 0
31.05.2015, 22:28
    #38972862
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppMasterZiv,

Так тут же пишут, что C++ и так кроссплатформенный, если не считать побитовые операции.

битовые операции как раз и так кроссплатформные, дело не в этом.
есть куча случаев, когда программа завязывается на какую то специфику операционки или оборудования. Это не значит, что язык непереносимый, это значит, что есть специфика. Например, все программирование сетей TCP/IP специфично для каждой платформы. Есть программирование для платформ с разной битностью слов и адресов, это тоже классика. Например, преславутая задача о упаковке указателя в целое число и обратно.
Это все не непереносимость, в смысле, что одну программу надо заставлять работать на разных платформах, это кроссплатформенность, в смысле, что одна и та же программа должна работать по-разному на разных платформах. Это не совсем одно и то же, тут есть тонкая грань, которая заключается в том, что иногда в принципе одна и та же программа не может работать одинаково на разных платформах.
...
Рейтинг: 0 / 0
31.05.2015, 22:56
    #38972869
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cpp4. Почему С++ до сих пор не превратится в кроссплатформенный и многосистемный, как Java и C#?
5. Чем отличается программирование на C++ для Linux от программирования для Windows?

Я хочу ещё раз, возможно, в 20-ый, подчеркнуть, что составляет суть переносимости и кроссплатформенности языка С и С++ как его наследника.

Просто есть классические языки высокого уровня (3GL), типа Алгол, FORTRAN, PASCAL, PL1, которые тупо имеют железобетонные гарантии и транслируются в машинные коды в соответствии с этим, а есть более другие языки типа С и С++.

Как программисты шутят, С -- это переносимый ассемблер PDP-11, думающий, что он -- язык высокого уровня. Это шутка, но в ней есть действительно большая доля правды. С -- это по сути переносимый кроссплатформенный ассемблер, он для этого создавался, для переноса системы Unix с одной платформы на другую. Это язык высокого уровня, обладающий не меньшей мощью, чем ассемблер (т.е. язык машинных комманд), но компилируемый в машинные команды, и не всегда один в один, как ассемблеры.
В языке С есть определённые гарантии, которые сохраняются от платформы к платформе, которые и позволяют написать ядро операционки, скажем, линукс, на одной платформе, и портировать её на другую, где есть уже компилятор С.
(сам компилятор С так же пишется на С и портируется перед этим шагом).

Но любая программа где-то опирается на эти самые гарантии языка, а где-то не может позволить себе это делать, в основном, в силу каких-то причин требований производительности или оптимизации.
Вот тут и начинаются танцы с кроссплатформенностью. Это всегда такие моменты, относительно которых С гарантии
не даёт, но в данном конкретном месте на данной конкретной платформе надо как-то вертеться, чтобы что-то работало.

Это сложно описать в общем, но как бы это так.

Я тут немного устал уже, но в общем С-программисты встречаются с необходимостью кроссплатформной разработки достаточно часто, это и та самая задача упаковки указателя в число и распаковки обратно, и задачи типа обращения к одной области памяти в разных видах, например, как массив байт и в виде какой-то структуры, и много других задач подобного рода.

Я потом попробую расписать задачу передачи указателя в виде целого на примере организации множественных потоков управления.
...
Рейтинг: 0 / 0
01.06.2015, 18:31
    #38973696
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppПод метапрограммированием я понимаю вычисления на основе хитростей с шаблонами (вычисление факториала и т.д.). Возможно, моё понимание ошибочно.
да,
можно написать один шаблон для long-ов, short-ов и char-ов, который будет вычислять
факториал.
...
Рейтинг: 0 / 0
01.06.2015, 20:32
    #38973778
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Ещё один вопрос, чтобы не создавать лишнюю тему. Написал, чтобы закрепить знания код. В книжках пишут, что можно объявить деструктор приватным. Но Компилятор ругается, если же уберу слово private, то всё компилируется. Использую VS2013.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

class C{
public:
	C(){
		std::cout << "C()" << std::endl;
	}

	void del(){
		C::~C();
	}

private:
	~C(){
		std::cout << "~C" << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
         C c;
}
...
Рейтинг: 0 / 0
01.06.2015, 21:05
    #38973795
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppЕщё один вопрос, чтобы не создавать лишнюю тему. Написал, чтобы закрепить знания код. В книжках пишут, что можно объявить деструктор приватным. Но Компилятор ругается, если же уберу слово private, то всё компилируется. Использую VS2013.

И правильно делает.

Ты МОЖЕШЬ объявить деструктор приватным, но тогда это сделает невозможным создание объектов на стеке и в глобальной памяти .
Тут именно это и происходит -- ты объявил деструктор приватным, и создаёшь автоматический объект.
...
Рейтинг: 0 / 0
01.06.2015, 21:46
    #38973813
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
MasterZiv,

тогда при замене на ниженаписанный код всё работает. Единственный ли это способ пользоваться объектами с приватными деструкторами? Правильно я понял, что объект может создаваться в куче, на стеке или в глобальной памяти (static), и существует только 3 вида памяти в С++, которые так и называются?
Код: sql
1.
2.
3.
4.
5.
int _tmain(int argc, _TCHAR* argv[])
{
         C* c = new C();
         c->del();
}
...
Рейтинг: 0 / 0
01.06.2015, 21:51
    #38973816
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppвсё работает.
Не совсем )))
Вот это - утечка памяти, т.к. ничего не удаляет, а только деструктор вызывает.
Код: plaintext
1.
2.
3.
void del(){
  C::~C();
}


Правильно делать так:
Код: plaintext
1.
2.
3.
void del(){
  delete this;
}
...
Рейтинг: 0 / 0
01.06.2015, 21:55
    #38973817
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppВ книжках пишут, что можно объявить деструктор приватным.
Можно и в ногу выстрелить, но обычно не стреляют )).
Зачем вам приватный деструктор?
...
Рейтинг: 0 / 0
01.06.2015, 22:02
    #38973820
code_cpp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
Anatoly Moskovsky,

в книгах разбирают примеры, наверное, они нужны, а может и нет. На всякий случай решил разобраться. Что про память скажете, про которую я рядом с кодом спросил?
...
Рейтинг: 0 / 0
01.06.2015, 22:08
    #38973826
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по С++
code_cppЧто про память скажете, про которую я рядом с кодом спросил?
На все вопросы - да.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопросы по С++ / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]