4 ms·
C++ comes with the OOP mindeset: OOP is about polymorphism, inheritance and encapsulation. Now what if you are abstracting over the wrong library for a given ta
by MichaelMoser123 8y ago
C++ comes with the OOP mindeset: OOP is about polymorphism, inheritance and encapsulation. Now what if you are abstracting over the wrong library for a given task? Will you be able to question your basic assumptions, or is that an assumption that is not allowed to be questioned? (due to the encapsulation principle)
- thestoicattack 8y agoI don't think C++ comes with the OOP mindset. At least, not recently. Most people will tell you it's "multi-paradigm." And I would say C++ certainly gives you enough flexibility to dig underneath the abstractions, as TFA shows.
- MichaelMoser123 8y agoI am not so sure about the multi-paradigm thing: In c++ everything is a class. Also of you try hard enough then you may implement any paradigm in any language.
- thestoicattack 8y agoThat's Java, isn't it? I write lots of C++ without classes.
- mindcrime 8y agoEven though Java is still very "class-centric", in the strictest sense Java doesn't make "everything a class". There have always been primitives for things like int, long, boolean, float, double, etc. And now that we have MethodHandles and what-not, you can (sort of) start to think of functions as first class entities in Java. And there are Lambdas as well which effectively let you build a function without it needing a class to contain it.
- thestoicattack 8y agoI was being a little flippant and unfair to Java because I was trying to find where the claim "everything is a class" had appeared from.
- lultimouomo 8y agoYou mean except booleans, integers, floats, pointers, free functions, namespaces, templates and lambdas?
- gpderetta 8y agoAlso a class in C++ is by default exactly the same as a struct (except for default access control which is a minor thing). An OOP style class would be any class type (including struct) with virtual functions which you would have to opt in.
- asveikau 8y agoI agree with your sentiment but the lambdas do get treated as anonymous classes overloading operator ().
- kllrnohj 8y agoNot really true. Lambdas can be converted to a class overloading operator() (such as std::function), but they are not inherently that. You can use them as just function pointers, too. Example: #include <cstdio> void call_func(void(*func)()) { func(); } int main(int argc, char* argv[]) { // Lambda can be converted to a function pointer call_func([]() { printf("hello as a function pointer\n"); }); }
- asveikau 8y ago> but they are not inherently that. I am fairly certain I have had error messages and disassemblies that suggest otherwise. This may however be an implementation detail. > You can use them as just function pointers, too. Yes, I know this. It only works when there are no captures. And AFAIK once there are captures you start getting object code that looks a lot like you put those captures into an anonymous class. (When not inlined.)
- slavik81 8y agoYou can get that sort of behaviour from any class by implementing the conversion operator. I assume that lambda implements `operator(void(*)())` so it is implicitly convertible to a function pointer.
- pjmlp 8y agoBetter learn C++ before criticising it.
- Sharlin 8y agoThe "STL" part (data structures and algorithms) part of the C++ standard library uses no OO design at all. The iostreams part does, but it's hardly visible to the user. (No, simply having syntax that allows you to write `data.function()` instead of `function(data)` doesn't make anything object-oriented.)
- lultimouomo 8y agoThere is exactly 0 polymorphism and very limited inheritance in the code referenced by the article. And STL really isn't based on an OOP mindeset.
- pdpi 8y agoThere is exactly zero _subtype_ polymorphism. The STL uses templates as a means to achieve parametric polymorphism (i.e, generics).
- deleted 8y ago[deleted]
- MichaelMoser123 8y agoYeah, and zero encapsulation also. Keep up the good work!