LINUX.ORG.RU

Зачем нужен forward declaration в C++?

 ,


0

3

Не холивара ради, сравнение кода Swift и C++:

class Object {

	let inventory = Inventory()

}

class Inventory {

	var items = [Object]()

}

class Human: Object {}

class Sandals: Object {}

class Socks: Object {}

let human = Human()
human.inventory.items.append(Socks())
human.inventory.items.append(Sandals())

print("Items count: \(human.inventory.items.count)")

Собираем, запускаем:

swiftc includeEachOther.swift -o includeTest && ./includeTest 
Items count: 2

C++:

#include <vector>
#include <iostream>

using namespace std;

class Object {

public:

	Inventory *inventory;

};

class Inventory {

public:

	vector<Object *> items;

};

class Human: public Object {};

class Sandals: public Object {};

class Socks: public Object {};

int main() {

	auto human = new Human();

	human->inventory = new Inventory();
	
	human->inventory->items.push_back(new Sandals());
	human->inventory->items.push_back(new Socks());	

	cout << "Items count: " << human->inventory->items.size() << endl;

	return 0;

};

Собираем, запускаем:

 g++ -std=c++11 includeEachOther.cpp -o includeTest && ./includeTest

includeEachOther.cpp:10:2: error: unknown type name 'Inventory'
        Inventory *inventory;
        ^

Если добавить forward declaration - class Inventory в .cpp, то все заработает. Я не понимаю почему в C++ нужно это в 2017 году, кто-нибудь может объяснить?

Ответ на: комментарий от RazrFalcon

Ну блин. Понятно что в синтаксис C++ это не встроится. А языки с GC вовсе в сравнении не участвуют.

И так сделали вполне прямолинейный brainfuck^W вариант.

anonymous
()
Ответ на: комментарий от RazrFalcon

Как в других современных языка. См. rust, ruby, python, etc.

И Ruby, и Python-у за 20 лет каждому. Староваты они для современных как-то.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Опять придираетесь.

простите его, он не знает что в вашей реальности все не так как в нашей

anonymous
()
Ответ на: комментарий от RazrFalcon

Да и что там выпилили?

В c++11 выпилили export. В c++17 объявили auto_ptr deprecated. Это то, что я навскидку сидя сейчас в поезде на пути домой вспомнил.

hateyoufeel ★★★★★
()
Ответ на: комментарий от RazrFalcon

См. rust

Знаешь, при всех достоиствах Rust синтаксис у него ещё хуже в плане читаемости чем у C++. Так что не надо туда смотреть, там червие.

Алсо, более убогих лямбд чем в пердоне вроде больше нигде нет.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну еще смысл ключевого слова auto поменялся в C++11. В C++17, емнип, register нельзя будет использовать. Плюс удаляется куча ставшего ненужным из functional (вроде unary_function/binary_function, mem_fun_ref и т.д.).

eao197 ★★★★★
()
Ответ на: комментарий от zaz

ехал auto через auto видит auto в auto auto сунул auto auto в auto auto за auto auto цап!

А ещё нужно париться про то, что const auto & != auto

dzidzitop ★★
()
Ответ на: комментарий от RazrFalcon

Много причин этому. Раздельная компиляция в том числе.

dzidzitop ★★
()

Жопа ленивая, гуглани про влияние инклюдов в хедерах на тормоза при сборке чего-то большего чем твои хеллуворлды.

Не холивара ради

в забане своим зеленым друзьям расскажешь

anonymous
()
Ответ на: комментарий от dzidzitop

За гото не по делу и программирование с гото там, где без него можно однозначно обойтись — однозначно подвешиват :)

anonymous
()
Ответ на: комментарий от hateyoufeel

выпилили

Ой-вей :) Все прям все бросили и побежали выпиливать. стд асинк впилить не могут норм из-за ценных мнений авторов буста и «тоже членов комитета», а экспорты выпилили прям сразу и полностью. Единогласно.

anonymous
()
Ответ на: комментарий от anonymous

почему вы вообще решили, что там «проходы» есть? там дерево строят по исходникам и работают с ним.

ckotinko ☆☆☆
()
Ответ на: комментарий от anonymous

экспорты выпилили прям сразу и полностью. Единогласно.

Удивительно, правда? Тут надо добавить, что поддержка export была только у полутора не самых популярных компиляторов, но это незначительная мелочь.

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous

стд асинк впилить не могут норм из-за ценных мнений авторов буста и «тоже членов комитета»

Бартош расписывал, почему его «не могут норм», при чем тут авторы буста?

anonymous
()
Ответ на: комментарий от Macil

А за использование ключевого слова «new» в современных плюсах нужно убивать.

Нужно убивать тех, кто «знает» как надо, не имея понятия о кейсе.

andreyu ★★★★★
()
Ответ на: комментарий от orkshaman

лучшая читаемость

Ой жы вей. А за счет чего же у тебя там лучшая читаемость? В твоем ООП головного моска с «лудшей читаемостью» не бывает pimpl, бгг, «понижения связности кода», избегания циклических зависимостей или банально передачи типов сложнее int по ссылкам, чтоб не компилять каждый раз все подряд при изменениях в одном классе?

anonymous
()
Ответ на: комментарий от Macil

Извини, но аффтар не понимает как работает C++.

А я прочитал всю статью и у меня сложилось другое впечатление об авторе.
Так же я прочел весь ваш комментарий. И на ваш счет у меня тоже есть мнение. Далеко не лестное.

А своё непонимание пытается скрыть за «седыми яйцами» и апломбом.

Зато вы ничего не скрываете, но мнение имеете.

andreyu ★★★★★
()
Ответ на: комментарий от Macil

да и любой (окромя std::array) стандартный контейнер в тёплых чувствах к кешу уличён не был.

В std::array, как и в std::vector можно сгрузить указатели на объекты, которые будут разбросаны по памяти.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

В 11 auto_ptr deprecated, в 17 - удален. Кажется, единственная настоящая поломка.

Ну за 6 лет можно было и пофиксить. Тем более, что фикс достаточно тривиален.

andreyu ★★★★★
()
Ответ на: комментарий от orkshaman

С темы съезжай на асм и Ц, на вопрос вопросом отвечай, набрасывай жупелы про ООП, «лудшую читаемость», которые к форвардам в С++ тоже не имеют отношения (а «лудшая читаемость»(ТМ) без них — «дискасабл и дабтфул», т.е. сорта холиварного булшыта (или с прямыми накладными расходами на конпеляцию при немношк большой кодовой базе :) Буззвордами про «лучшую читаемость» начал разговаривать ты — давай, рассказывай про свое ея понимание (заодно про время конпеляции твоих «лудшы читаемых» сорцов и зависимости — чо из песни слова выкидывать :)

anonymous
()
Ответ на: комментарий от orkshaman

В первом посте, бггг, твое непонимание, на примере, который не отражает :) Возьми «хорошо читаемый» (ТМ) проЭкт с гитхаба с объемной кодовой базой, где «не повторяют себя» и массово переиспользуют с темплейтами и хедер-онлями, но... инклудят бестолково — и померяй время конпеляции vs проэкт в котором не увлекаются иерархиями, немношк форвардят, но изменение в одном классе не влечет за собой лавинообразную переконпеляцию всего подряд. (А для чистоты эксперимента — еще и на свифте проэкт возьми сравнимого размера... если найдешь :))

anonymous
()
Ответ на: комментарий от anonymous

немношк форвардят

Немношко зафорвардил, неможко на чистых C написал, немножко велосипедов для управления памятью. Потом через неделю непонятно где креш, и как это чудо работает вообще.

orkshaman
() автор топика
Ответ на: комментарий от orkshaman

Потом через неделю непонятно где креш, и как это чудо работает вообще.

Так бы и сказал «не смог писать так, чтоб понимать через неделю написанное» (или просто «ниасилел»)  — вот и вся твоя «лудшая читаемость»(ТМ) (а особенно управление памятью в твоих велосипедах тут при том что... ну ты улавливаешь же, да? :))

anonymous
()
Ответ на: комментарий от orkshaman

Бггг, не, ты просто не кодил/сопровождал достаточно больших проектов для достаточного количества клиентов, где никто не будет ждать три дня пока пересоберется на твоей машине, потому что никто не собирается рассказывать клиентам кулстори как в связи «с вызовами эпохи и требованиями бузинеса хорошие люди бузинес-аналитеги опять поменяли пару вилок в конфиге шаблонизатора для дельта-энкодера, а у нас все еще компиляется»(c) для оправдания «сдвига расписания снова вправо» особенно если на одной "(ре)организации" включений сорцов можно эти три дня свести к полутора часам, на той же машине без дружбомагии с компилятором, «апгрейда билдсервера» и т.д. «простых решений проблем», которые проще было не создавать, чем решать вот так, «чтоб сохранить читаемость сорцов и дальше кодить не приходя в сознание» — всяко лучше когда можно еще успеть прожечь это в FPGA или ASIC (в зависимости от бюджета клиента) в тот же день, а не «когда скомпиляется» :))

anonymous
()
Ответ на: комментарий от anonymous

Не пойму откуда столько боли относительно времени компиляции, если твой месяц фикса вставок сишного кода стоит гораздо дороже)

anonymous
()
Ответ на: комментарий от dzidzitop

Член секты канделябристов?

Нет. Член секты оторинопроктологов-реаниматоголов и штатный ветеринар-вивисектор. Лечу хтонического бегемота-мутанта от ларингита. Бегемота. С хоботом. Без рта. С ушами от слона. Пятью ногами. Тремя глазами. Панцирем рака и доставшейся в наследство от него незамкнутой кровеносной системой.

Анамнез приходится собирать путём помещения в нечеловеческие условия опытных образцов. Регулярно присылают трупы и вытекшие продукты жизнедеятельности для анализа.

Это я к чему. Когда приходишь домой после тяжкого дня горестных раздумий, не то что яйца по канделябрам развешивать тянет... В голову приходят намного более изощрённые мысли.

Macil ★★★★★
()
Ответ на: комментарий от andreyu

А я прочитал всю статью и у меня сложилось другое впечатление об авторе.

Всю свою «истину» автор мог бы изложить в одной фразе: «мне не нравится shared_ptr», а не растекаться по древу со своими советами по велосипедостроению. К сожалению, это проблема C++: карго-культ и велосипедостроение.

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

Действительно, зачем? Проще поучать да разглагольствовать. Голословно, без кода. Потому что невозможно критиковать то, чего нет.

Macil ★★★★★
()

Туповатое ограничение. Особенно, если посмотреть на подобный случай:

struct Foo {
  void bar() { baz(); } // компилируется
  void baz() {}
};

Я слышал что это требование из-за того, что компилятор C++ — single pass.

KennyMinigun ★★★★★
()
Ответ на: комментарий от rupert

ты это сам читал? причем тут компиляция...

The 7 phases of translation [1] .... [1] Paraphrased from C++98 2.1, the seven phases are:

1. Trigraph and Universal character name conversion.

2. Backslash line splicing.

3. Conversion to preprocessing tokens. The Standard notes this is context dependent.

4. Preprocessing directives executed, macros expanded, #includes read and run through phases 1..4.

5. Conversion of source characters inside char and string literals to the execution character set.

6. String literal concatenation.

7. Conversion of preprocessing tokens to C++ tokens.

drsm ★★
()
Ответ на: комментарий от anonymous

чё-то как-то убогенько в таком виде

anonymous
()
Ответ на: комментарий от hateyoufeel

auto_ptr deprecated

зачем нужен? ведь есть unique_ptr

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.