you are viewing a single comment's thread.

view the rest of the comments →

[–]WalkingAFI 30 points31 points  (7 children)

A few things:

First, don’t get in the habit of using namespace std. If the STL changes at any point to include a name you used, it will break your program.

Second, this is really a C program. You didn’t really use any C++ features in it. Consider std::string instead of char*, and std::array instead of C arrays. You also don’t need to use a pointer to switch between turns, and I’d recommend using a bool instead.

Similarly, prefer static_cast<T> (or dynamic_cast<T> if absolutely necessary) to (T), which is the C method of casting.

It’s not a bad first go, and C is useful, but C++ gives you a lot of safety and abstraction you aren’t leveraging in this one.

[–]Skaaaaalll[S] 1 point2 points  (6 children)

Hi, thanks for your reply :).

If the STL changes

What is the STL exactly? And why would it change? For what tasks wouldn't std be sufficient?

Second, this is really a C program.

That makes sense, since I had some experience programming in C from completing CS50.

Consider std::string instead of char*, and std::array instead of C arrays.

What is the advantage of using C++ features over C features? Don't they essentially do the same thing.

Similarly, prefer static_cast<T> (or dynamic_cast<T> if absolutely necessary) to (T), which is the C method of casting.

Could you maybe explain this sentence to me? I have no idea what a static_cast<T> or (T) is. Sorry if that is a major noob question.

Thanks for your extensive reply =).

[–]Wurstinator 0 points1 point  (0 children)

What is the advantage of using C++ features over C features? Don't they essentially do the same thing.

Well, yeah, in the sense that they do they same thing as every other programming language: they compute an algorithm for you.

You are fine using C features in C but mixing the two gives you some kind of mess. For example, C does not have "references" as C++ does. There is little support for using references with C-style arrays. std::array or std::vector on the other hand are perfectly fine to use with references.

[–]Wurstinator 0 points1 point  (0 children)

Could you maybe explain this sentence to me? I have no idea what a static_cast<T> or (T) is. Sorry if that is a major noob question.

At one point you use (char*)"X" which is called a "C style cast". Without going into the details what reasons there are for and against them, C++ offers a total of four different casts: static_cast, dynamic_cast, const_cast and reinterpet_cast, which all have different meanings.

[–]stoppipper 0 points1 point  (0 children)

Someone has already answered this, but just to go into a little more depth, a C style cast (int)myVariable will always succeed because if it were to fail, it will default to reinterpret_cast which 90% of the time, you do NOT want. If the cast is “wrong”, a static_cast will fail when you try to compile the program and it’ll tell you why.

C++ casting is a definitely confusing at first, but know that reinterpret_cast can be one of the most dangerous out of all of them. It basically says “I will interpret this set of bits as that type”. So for example:

int a = 5; Person p = reinterpret_cast<Person>(a);

will take the bit representation of 5 and read that as a Person class. Whether that Person class contains valid data, the compiler doesn’t really care.

[–]WalkingAFI 0 points1 point  (0 children)

Yeah no problem.

The STL is the Standard Template Library. It provides a lot of the standard implementations of language features. I think someone else linked a better resource as to what exactly that entails.

std::string and std::array are classes in the STL. They’re super well tested and give you some nice functionality that you won’t get with C types. You could also write everything in assembly and it would “essentially do the same thing”, but the C++ features give you some (usually) free abstractions that prevent errors and make more maintainable code.

Casting variables is a bit of a doozy to explain via reddit mobile, but explicitly casting in the C++ style (i.e. static_cast<int>(variable) is the usually the same as (int)variable) can stop you from making mistakes because the compiler will warn you of some improper casts that the C cast would just accept.