@ProCxx

Страница 1206 из 2477
reagentoo
13.08.2017
22:54:06
не важно короче)

fox.cpp
13.08.2017
22:54:30
cmake же умеет VC++ использовать?

Google
Berkus
13.08.2017
22:56:14
да

но для GNU конпилера именно такие флаги

Alexander
13.08.2017
22:56:33
fox.cpp
13.08.2017
22:56:41
ну тогда надо (очень сильно) устроить соц. опросик

Используешь VC++ для сборки проектов, использующих CMake?

Berkus
13.08.2017
22:57:39
ответил нет, хотя собирал когда-то проект на vs2010, vs2015 и vs2017 из одного и того же cmakelists

проект что-то типа 12 библиотек и экзешник + сборка инсталлера на WiX

но раз вопрос "используешь" - нет, больше не страдаю фигней

Alexander
13.08.2017
23:03:55
ну а у меня на работе всё виндовое, так что юзаю

https://blogs.msdn.microsoft.com/vcblog/2017/08/11/c17-features-and-stl-fixes-in-vs-2017-15-3/

Thomas
14.08.2017
03:53:15
Привет! Я недавно начал изучать C++, а так пишу на шарпе. Мне в голову пришел интересный вопрос, начинается он со следующего: в C++ есть множественное наследование, в шарпе его нет, вместо этого есть множественная реализация интерфейсов. Выходит, как я понял, в C++ есть возможность множественно наследовать классы как абстрактные, так и конкретные. Здесь мне в голову приходит, что множ. наследовать классы от конкретных - вероятно не самая лучшая практика, самое верное приходит - один конкретный, 1 - n абстрактных. Вопрос: как вы поступаете?

Andrei
14.08.2017
03:55:54
Да, всё верно. Имплементацию лучше наследовать только от одного класса.

Причем это можно делать приватно.

Google
Andrei
14.08.2017
03:56:39
А еще можно предпочитать агрегирование наследованию, тоже неплохая практика, говорят.

Vladislav
14.08.2017
04:05:41
Andrei
14.08.2017
04:06:53
В идеале - обходиться без наследования вообще, кроме случаев когда оно необходимо
Я бы сказал так, что наследование интерфейса — плюс\минус ок, наследование имплементации — совсем не ок.

Thomas
14.08.2017
04:07:23
Почему?
Ну я сам еще не понял, но читал у какого то автора, что наследование портит инкапсуляцию

Thomas
14.08.2017
04:09:07
Спасибо за ответы, буду думать

Даниил
14.08.2017
04:13:08
Ну я сам еще не понял, но читал у какого то автора, что наследование портит инкапсуляцию
дело не в инкапсуляции, просто во-первых множественное наследование реализации сломано, а единичное наследование в большинстве случаев хуёво описывает связи в системе, а во-вторых дизайн построенный на наследовании реализации нерасширяем так что да, в идеале интерфейсы и композиция

Thomas
14.08.2017
04:13:51
В шарпе нет возможности множественного наследования, но шарп - это довольно детерменизированный язык, ни шагу в сторону. В плюсах, как я вижу, уж очень много возможности для импровизации, потому и вопрос встал, вдруг есть какие то креативные способы использовать множественное наследование

Даниил
14.08.2017
04:17:41
Я бы сказал так, что наследование интерфейса — плюс\минус ок, наследование имплементации — совсем не ок.
имплементация интерфейса - это не "плюс/минус ок", лучше вообще ничего не придумали другой вопрос что в крестах всё это сделано криво, но шо ж поделать

Thomas
14.08.2017
04:18:36
Хотя в принцыпе понятно. Это общий функционал между объектами разных классов, в итоге своего рода наследование. То есть, есть надстройка в виде некого объекта, реализующего функционал

Даниил
14.08.2017
04:40:09
ну вот нужен тебе класс который цепляется к базе данных и чё-то там шлёт, при том нужно работать с разными СУБД если делать на наследовании, то ты делаешь обобщённый класс а потом несколько унаследованных от него, каждый из которых работает с какой-то СУБД если на композиции, то логику соединения с базой ты выносишь в отдельный интерфейс, пишешь несколько классов реализующих его а в классе с основной логикой просто делаешь поле содержащее объект класса отвечающего за соединение т.е. очень грубо что-то типа interface IConnection { // ... } class MysqlConnection : IConnection { // ... } class PostgresqlConnection : IConnection { // ... } class Model<C> where C : IConnection { private C connection; // ... }

Google
Thomas
14.08.2017
04:48:49
То есть избавляешься от наследования, с помощью параметризации дженерика

Даниил
14.08.2017
04:49:56
Ага, даже так. Доходчиво. Выходит, далее можно комбинировать функционал таким образом в других классах (не в этом примере, а вообще)
в общем мы инкапсулируем какую-то функциональность за общим интерфейсом, который может иметь сколько угодно реализаций и повсюду используем эту функциональность не напрямую, а через общий интерфейс, чтобы реализацию легко было заменить

То есть избавляешься от наследования, с помощью параметризации дженерика
ну это один из вариантов можно (по крайней мере в C++ и Rust, за C# пояснить не готов, никогда не писал на нём) через динамический диспатчинг это сделать, тогда не будет дженерика, всё становится чуть проще но появляется некоторый оверхед в рантайме

Thomas
14.08.2017
04:54:28
Да с дженериками всё максимально понятно В шарпе почти то же самое public class Model<C> : IConnection { private C connection; // ... }

Даниил
14.08.2017
04:55:31
так я и пытался на шарпе тебе написать) только у тебя же сама модель реализует IConnection, а должно быть чтобы C реализовывало

Thomas
14.08.2017
04:56:24
А, ну да

Тупанул. Ночь сидел, видать поспать пора скоро

Даниил
14.08.2017
04:57:25
> скоро да давно уже)

Thomas
14.08.2017
04:59:10
> скоро да давно уже)
Почему то копаться лучше всего ночью получается. Никто не отвлекает. Инфы намного больше освоить получается,чем за то же дневное время

Влад
14.08.2017
05:12:17
Я так некоторые моменты забывал.

Код из шарпа походу

Thomas
14.08.2017
05:12:58
А потом засыпаешь..и...почти ничего не помнишь.
Смотря сколько до этого днём поспать

Даниил
14.08.2017
05:13:20
Код из шарпа походу
ну я же сказал что я на шарпе набросал (хоть я его и не знаю, лол)

Влад
14.08.2017
05:13:47
Сори, не увидел.

Thomas
14.08.2017
05:15:40
interface IConnection { // ... } class MysqlConnection : IConnection { // ... } class PostgresqlConnection : IConnection { // ... } class Model<C> where C : IConnection { private C connection; // ... } Этот? Ну да. Так я его перепутал с cpp, генерики я на нём не писал пока что

Google
Thomas
14.08.2017
05:17:35
(в c++)

Влад
14.08.2017
05:17:51
C++ generic = template.

В плюсах это принято называть шаблонами. Эт так, к слову.

Vladislav
14.08.2017
05:18:20
templates > generics

F.L
14.08.2017
05:18:23
???

Ilia
14.08.2017
05:18:55
Да, всё верно. Имплементацию лучше наследовать только от одного класса.
С фига ли ? Вообще, ваши рассуждения примерно похожи на следу: "Коллеги, я всё время сплю в женской ночной рубашке, но недавно мне подарили настоящую мужскую пижаму. Я знаю, что ночные рубашки надевают только через голову, но пижаму так не надеть целиком, верхняя часть надевается через голову, а нижняя — нет. Я слышал, что в принципе пижаму можно целиком как-то надеть, но мне приходит в голову, что надевать пижаму через ноги — вероятно, не самая лучшая практика. Как же вы одеваете пижаму ? Знаток пижам: "Да, всё верно, пижаму нужно надевать только через голову"!

F.L
14.08.2017
05:19:02
Мне слух режет когда вместо шаблона говорят дженерик Думаю скоро привыкну

Влад
14.08.2017
05:19:31
Эт не вместо.

Admin
ERROR: S client not available

Влад
14.08.2017
05:19:53
Просто шарписты и джависты так говорят, ибо в их ЯП так называется.

Vladislav
14.08.2017
05:20:30
Просто шарписты и джависты так говорят, ибо в их ЯП так называется.
неудивительно, ведь в шарпе/джаве именно дженерики, там нет шаблонов

Ilia
14.08.2017
05:20:44
как бы генерики и шаблоны —- немного разные вещи

Влад
14.08.2017
05:20:48
Эт да.

Влад
14.08.2017
05:21:19
как бы генерики и шаблоны —- немного разные вещи
Есть такое, но я бы не сказал, что прям большая разница.

F.L
14.08.2017
05:21:21
Просто шарписты и джависты так говорят, ибо в их ЯП так называется.
Я про джавистов и говорил Но я так понял я что-то упустил и чушь сказал

Thomas
14.08.2017
05:22:14
Просто шарписты и джависты так говорят, ибо в их ЯП так называется.
Ну как то надо находить соприкосновения, принцыпы то одни и те же, терминология только разная. Но совсем чуть чуть.

Даниил
14.08.2017
05:23:15
то есть ты всерьёз считаешь что множественное наследование реализации - это нормально и надо так делать? мда
и это в 2017 когда все поняли что вообще наследование (не говоря даже о множественном) создаёт не меньше проблем чем решает

Google
Thomas
14.08.2017
05:23:23
generic - runtime template - compile time, что то вроде этого. ну и тележка сверху

Friedrich
14.08.2017
05:25:57
Любопытно, что в dash документации нет даже упоминания interface, когда он в c++ есть, по крайней мере в VisualStudio. Да и куда ни глянь, редко где приводится
interface это COM-фича, в стандартном C++ такого ключевого слова нет. Документация верна; в портабельном коде не стоит этим пользоваться.

Thomas
14.08.2017
05:26:42
В принципе не плохо, по моему

(говорю не из-за моего c# бэкграунда)

Friedrich
14.08.2017
05:28:20
У них там просто #define interface class, по-моему. А код дополнительно анализируется какой-то тулой, чтоб эти интерфейсы оборачивать в TLB.

Vladislav
14.08.2017
05:28:24
В принципе не плохо, по моему
непортабельные расширения - "В принципе не плохо"? Что вообще тогда плохо в этом мире?

Friedrich
14.08.2017
05:29:55
Ну наверно не совсем так, там нельзя private определять и реализацию
По-моему, совсем так. Ты можешь что угодно наделать в этом «интерфейсе», а отвечать потом будешь перед TLB и COM-инфраструктурой. С точки зрения С++ этот код будет валидным.

Friedrich
14.08.2017
05:31:03
Хотя может, конечно, ты пишешь на C++/CLI или C++/CX. Там есть настоящие интерфейсы. Одна проблемка — это не настоящий С++ :)

Friedrich
14.08.2017
05:31:26
Погодь, это уже не interface, а какой-то __interface.

Thomas
14.08.2017
05:31:29
Разве что потом это GCC сбилдить

ага, я упустил деталь

Friedrich
14.08.2017
05:31:45
Ещё более глубокие глубины ада.

Я бы такое в современном коде не советовал использовать. Придерживайся стандарта, это максимально безопасно.

Vladislav
14.08.2017
05:32:54
Ещё более глубокие глубины ада.
есть objC++, вот уж где ад

Friedrich
14.08.2017
05:33:12
Много есть всяких кадавров, собранных из C++ и других языков :)

Страница 1206 из 2477