Ya, I have to say, I agree with the start with python advice. C++ is a very complex language (especially if you are using all the C++14 stuff, which you should be as it can produce way more elegant code), and learning a simpler language first can introduce you to many of the concepts such as variables, indirection, data structures, iteration, recursion, algorithms, closures, and functional programming without all of the syntax, compiling, and linking overhead. A lot of amateur programmers (and more professional programmers than you might expect) think that all they need to do to write code is learn the syntax, but you really need to learn basic programming paradigms (which apply to all languages), and then learn the dao (the "way") of the specific language. I would advise starting with Python or Scheme. Scheme is unfortunately not a very useful language; dialects of LISP (Scheme is a LISP dialect) are used in academia for AI prototyping, and in some distributed systems research, but other technologies are more popular for these problems in industry. The plus side to Scheme is that it has essentially no syntax, and so there is very little overhead in jumping right in and learning actual programming paradigms. Python on the other hand is a very useful language; it is fairly popular in industry, and is common in community projects as well. It has more syntax than Scheme (and by extension, the right way of doing things is sometimes complex), but it is still a lot simpler than C++, and is overall a good place to start.
As for the self taught vs class taught programmers discussion, they can definitely both be shit. Unfortunately, at the end of the day, what I have found is that being a good programmer requires two things: the right mindset, and experience. I've been programming for over 80% of my life, and still, when I look at stuff I did even two or three years ago, I think some of it is shit. The best way to learn to be a good programmer is to program, and ideally get code reviews from other good programmers. I suspect that the first good piece of code I ever wrote was during my second year as an intern during college (BTW, most grad students in CS write TERRIBLE code, it is astounding). As for the mindset, I think it requires a certain predisposition for algorithmic and structured thinking. Most people can sort a deck of cards, but would be completely unable to describe the process algorithmically, and define the structure of the auxiliary information that they keep in their head while doing it. Being a good programmer also requires a certain degree of laziness. If you find some problem that seems really hard, or you feel like you are doing a lot of work to get something to function, you are probably doing it sub-optimally and need to reduce the problem, or rethink the solution. Finally, I think it requires a certain degree of perfectionism. The compulsion to write elegant, concise, and efficient code is essential to avoid accepting bad, redundant, inefficient, unmaintainable code that "gets the job done" (anytime anybody ever says "but it works" as a reason not to rewrite/refactor something, I have desire to punch them in the face).
tl;dr: My advice is to start coding early and often, accept that EVERYTHING you are doing is wrong, but at least you will learn the basics. Then, if you like it, study computer science in school, which will do you very little good in the real world, but will at least give you a decent background in theory. Then, get a job as a programmer at a real company (not a shitty start up), where they have good programming practices like code reviews, unit tests, universal source control and build infrastructure, etc. After doing this for a few years, you will probably be a decent programmer.