简体   繁体   中英

error: classname does not name a type

I'm an intermediate student starting on pointers. I'm trying to store data in an array to be called by a search function later. When I try to compile, I am told "error: retail does not name a type" and I don't understand what that means or how to fix it.

// ********************************************************
// Starting Out with C++                                  *
// From Control Stuctures through Objects                 *
// seventh edition                                        *
//                                                        *
// Chapter 8 Searching and Sorting Arrays                 *
//                                                        *
// Serendipity Booksellers Software Development           *
// Project — Part 8: A Problem-Solving Exercise           *
//                                                        *
// Multi-File Program                                     *
// ********************************************************
#include "bookinfo.h"
#include "cashier.h"
#include "invmenu.h"
#include "reports.h"
#include <iostream>
using namespace std;

// Constant for array sizes
const int SIZE = 20;
// Global Arrays
string bookTitle[SIZE];
string isbn[SIZE];
string author[SIZE];
string publisher[SIZE];
string dateAdded[SIZE];
int qtyOnHand[SIZE];
double wholesale[SIZE];
double retail[SIZE];

retail[SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

wholesale[SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

qtyOnHand[SIZE] = {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10};


dateAdded[0] = "1/1";
dateAdded[1] = "1/1";
dateAdded[2] = "2/1";
dateAdded[3] = "3/1";
dateAdded[4] = "4/1";
dateAdded[5] = "5/1";
dateAdded[6] = "6/1";
dateAdded[7] = "7/1";
dateAdded[8] = "8/1";
dateAdded[9] = "9/1";
dateAdded[10] = "10/1";
dateAdded[11] = "11/1";
dateAdded[12] = "12/1";
dateAdded[13] = "13/1";
dateAdded[14] = "14/1";
dateAdded[15] = "15/1";
dateAdded[16] = "16/1";
dateAdded[17] = "17/1";
dateAdded[18] = "18/1";
dateAdded[19] = "19/1";


author[0] = "0";
author[1] = "1";
author[2] = "2";
author[3] = "3";
author[4] = "4";
author[5] = "5";
author[6] = "6";
author[7] = "7";
author[8] = "8";
author[9] = "9";
author[10] = "10";
author[11] = "11";
author[12] = "12";
author[13] = "13";
author[14] = "14";
author[15] = "15";
author[16] = "16";
author[17] = "17";
author[18] = "18";
author[19] = "19";

bookTitle[0] = "0";
bookTitle[1] = "1";
bookTitle[2] = "2";
bookTitle[3] = "3";
bookTitle[4] = "4";
bookTitle[5] = "5";
bookTitle[6] = "6";
bookTitle[7] = "7";
bookTitle[8] = "8";
bookTitle[9] = "9";
bookTitle[10] = "10";
bookTitle[11] = "11";
bookTitle[12] = "12";
bookTitle[13] = "13";
bookTitle[14] = "14";
bookTitle[15] = "15";
bookTitle[16] = "16";
bookTitle[17] = "17";
bookTitle[18] = "18";
bookTitle[19] = "19";

isbn[0] = "0";
isbn[1] = "1";
isbn[2] = "2";
isbn[3] = "3";
isbn[4] = "4";
isbn[5] = "5";
isbn[6] = "6";
isbn[7] = "7";
isbn[8] = "8";
isbn[9] = "9";
isbn[10] = "10";
isbn[11] = "11";
isbn[12] = "12";
isbn[13] = "13";
isbn[14] = "14";
isbn[15] = "15";
isbn[16] = "16";
isbn[17] = "17";
isbn[18] = "18";
isbn[19] = "19";


int main()
{
    int choice = 0; // To hold the user's menu choice

    // Display the menu until the user selects item 4
    while (choice != 4)
    {
        cout << "Serendipity Booksellers\n";
        cout << "\tMain Menu\n\n";

        cout << "1.Cashier Module\n";
        cout << "2.Inventory Database Module\n";
        cout << "3.Report Module\n";
        cout << "4.Exit\n\n";

        // Get the menu choice as input from the user
        cout << "Enter Your Choice: ";
        cin >> choice;

        // Validate the user's input
        while (choice < 1 || choice > 4)
        {
            cout << "\nPlease enter a number in the range 1 - 4.\n";

            cout << "Enter Your Choice: ";
            cin >> choice;
        }

        // Display a selection message
        {
            switch (choice)
            {
                case 1:
                    cashier();
                    break;
                case 2:
                    invMenu();
                    break;
                case 3:
                    reports();
                    break;
                case 4:
                    cout << "\nYou selected item 4.\n";
                    break;
            }
        }

        cout << endl << endl;
    }
    return 0;
}

How am I failing to initialize the arrays? Have I formatted my declarations incorrectly?

You cannot initialize an array with:

retail[SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

You can initialize it when it is declared.

double retail[SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

Or you can set the values using a for-loop.

for (int i = 0; i < 20; ++i )
{
   retail[i] = i;
}

Using C++11 initialization list is a blessing and match really well with std::vector:

initializing :
std::vector<double> retail {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
assigning :
std::vector<double> retail2; retail2 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

Try to avoid C array, vector have:
-Bound checks
-Automatic Memory Management (RAII, automatic grow, etc...)
-Iterator
-Interact well with the algorithms and adapter of STL

Although the problem that you originally asked about has been solved, I think a bigger issue is the use of "parallel arrays" - this sort of data structure is a source of many bugs. It is much better to create a struct or class to describe each book entry and to them maintain a collection of these items, for instance

class BookEntry {

public:
    BookEntry(const std::string &title, const std::string &author, const std::string &isbn, double wholesalePrice, double retailPrice, const std::string &dateAdded, int quantityOnHand = 0)
        : title_m(title), author_m(author), isbn_m(isbn), wholesalePrice_m(wholesalePrice), retailPrice_m(retailPrice), dateAdded_m(dateAdded), quantityOnHand_m(quantityOnHand)
    {

    }

    std::string title_m;
    std::string author_m;
    std::string isbn_m;

    double retailPrice_m;
    double wholesalePrice_m;
    std::string dateAdded_m;

    int quantityOnHand_m;
};

// main.cpp

#include <iostream>
#include "BookEntry.h"

int main(int argc, const char * argv[])
{
    BookEntry bookEntries[] = {
            // Title,                        Author,           ISBN,             Wholesale,      Retail,      DateAdded,       QuantityOnHand
            { "The Hobbit",                  "J.R.R. Tolkein", "978-0547928227", 5.43,           9.77,        "1937-Sep-21",   1234 },
            { "The Fellowship of the Ring",  "J.R.R. Tolkein", "978-0547928210", 7.99,           10.67,       "1954-Jul-29",   4321 },
            { "The Two Towers",              "J.R.R. Tolkein", "978-0547928203", 8.01,           10.68,       "1954-Nov-11",   3214 },
            { "The Return of the King",      "J.R.R. Tolkein", "978-0547928197", 8.43,           10.77,       "1955-Oct-20",   2143 },
            { "The Talisman",                "Stephen King",   "978-1451697216", 4.31,            8.98,       "1984-Nov-08",   3333 }
    };


    for (auto &b : bookEntries) {
        std::cout << "Title: " << b.author_m << "; Author: " << b.author_m << std::endl;
    }

    return 0;
}

Notice how the data for initializing a BookEntry is now organized in a consistent way, so that it is much easier to identify a "record" in the array, and much harder to leave on element out, making the entire structure inconsistent.

In actual practice, you would probably refactor BookEntry to separate the books identity from its inventory and pricing information, and all of this would be kept in a database and initialized from there, but you'd still want a good data model in your program, not just a ton of parallel arrays.

You cannot initialize retail like that, try this:

double retail[SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

Although as you are using c++ i would recomend trying to use stl types such as vectors.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM