2

I'm currently having trouble with part of Chapter 6 of "Programming: Principles and Practice Using C++" (2nd ed, 3rd printing).

According to the book's index, an example of a member initializer list is on page 184.

Part of page 184 reads as follows:

"Here, we'll just provide two member functions to give us a more convenient way of initializing Tokens:

 class Token {
    public: 
    char kind; // what kind of token
    double value; // for numbers: a value
    };

We can now initialize ("construct") Token objects. For example:

Token t1 {'+'}; // initialize t1 so that t1.kind = '+'
Token t2 {'8,' 11.5}; // initialize t2 so that t2.kind = '8' and t2.value = 11.5

"

Is one of these sets of code an example of a member initializer list as the index would indicate? I'm somewhat confused because, based on another Stackoverflow answer (What is this weird colon-member (" : ") syntax in the constructor? ), I thought a member initializer list would look something more like:

Name_value(string n, int v)
                :name(n), value(v) { }

(found within the following code by Chrinkus on Github: https://github.com/Chrinkus/stroustrup-ppp/blob/master/chapter06/ex04_Name_value.cpp )

class Name_value {
    public:
        string name;
        int value;
        Name_value(string n, int v)
            :name(n), value(v) { }
};

I think it's far more likely that I'm mistaken than that there is a typo on the book, but nonetheless, I'm finding this part of the book confusing. I appreciate any feedback you may be able to offer.

Update: I find it interesting that the drill for chapter 6 includes this code:

Token(char ch) // make a Token from a char
        : kind(ch), value(0)
    {}
    Token(char ch, double val) // make a Token from a char and a double
        : kind(ch), value(val)
    {}

Those are member initializers, are they not? I wonder if the author meant to refer to those two functions when he wrote "Here, we'll just provide two member functions to give us a more convenient way of initializing Tokens:"

KBurchfiel
  • 635
  • 6
  • 15
  • [Constructors and member initializer lists](https://en.cppreference.com/w/cpp/language/initializer_list) – Remy Lebeau Apr 11 '20 at 01:33
  • Thank you for sharing that link. I'm not really seeing cppreference.com's example of an initializer list referenced on page 184, but again, I may be overlooking something obvious. I know the book's example shows how Tokens t1 and t2 can be initialized, but I'm not seeing the sort of "S() : n(7) {}" format that is seen on the link you shared. – KBurchfiel Apr 11 '20 at 01:58
  • The example you have shown is not using a member initialization list, so the index is clearly referring to the wrong page number. Unless you have not shown everything that is on that page. I don't have that book to look at. – Remy Lebeau Apr 11 '20 at 02:00
  • @Remy Lebeau thank you for clarifying this. I'm pretty sure that the other parts of the page don't make any mention of a member initializer list. Maybe I will try reaching out to Bjarne? I checked the errata lists for both the 3rd and 4th printing and they didn't state that there was an error in the text that I quoted. – KBurchfiel Apr 11 '20 at 02:05
  • @KBurchfiel Took me a while but please check my answer before you reach out to Bjarne. ;) – Ingo Mi Apr 11 '20 at 02:53

1 Answers1

3

I reached out to Bjarne by email, and he promptly informed me that this was a bug that would be fixed in the next printing. So my guess is that that section of page 184 was meant to read more or less as follows:

"Here, we'll just provide two member functions to give us a more convenient way of initializing Tokens:

 class Token {
    public: 
    char kind; // what kind of token
    double value; // for numbers: a value
    Token(char ch)  // make a Token from a char
        :kind(ch), value(0) { }    
    Token(char ch, double val) // make a Token from a char and a double
        :kind(ch), value(val) { }

};

We can now initialize ("construct") Token objects . . ."

The two member initializer lists in the above code were taken from the sample code for the chapter 6 drill, which is available here: http://www.stroustrup.com/Programming/calculator02buggy.cpp (Please note that this code contains some intentional bugs that the reader is meant to solve within the drill exercise.)

I hope this will be useful to anyone else who was confused about member initializer lists. The book has been very useful for me so far and I plan to continue to read through it.

KBurchfiel
  • 635
  • 6
  • 15