Home > Net >  Invalid use of non-static member function with header files
Invalid use of non-static member function with header files

Time:11-30

#define MYSQLPP_MYSQL_HEADERS_BURIED
#include <mysql  /mysql  .h>
#include <iostream>
#include "/home/sulli313/Project4/Film.h"

void Film::showList(){
    std::cout << "\n-----------------------------------" << std::endl;
    std::cout << "         Query Application         " << std::endl;
    std::cout << "-----------------------------------" << std::endl;
    std::cout << " 1 All letter name actors" << std::endl;
    std::cout << " 2 First # PG-13 and Above" << std::endl;
    std::cout << " 3 All active/inactive users by store" << std::endl;
    std::cout << " 4 Actor Movie titles and ids" << std::endl;
    std::cout << "-1 Exit" << std::endl;
    std::cout << "-----------------------------------" << std::endl;
    std::cout << ">> Enter your choice:" << std::endl;
}
void Film::showOne(){
mysqlpp::Connection myDB("cse278F2022", "localhost", "cse278F2022",
            "raspberrySeltzer");
    // Create a query
    mysqlpp::Query query = myDB.query();
    std::cout << "Please enter a Letter A-Z!" << std::endl;
    std::string letter;
    std::cin >> letter;
        ///////////////////////////////////Do this part/////////////////////////////////////////////
    //if(letter)

    query << "SELECT first_name, last_name "
          << "FROM actor " 
          << "WHERE first_name " 
          << "LIKE '"   letter   "%'";
       //     << "WHERE code = \"IST\"";

    query.parse();
    mysqlpp::StoreQueryResult result = query.store();

    std::cout << "Here is your selection!\n" << std::endl;
    std::cout << "--First/Last Names of Actors Whos First ";
    std::cout << "Name Stars With "   letter   "--\n" << std::endl;

    std::cout << std::left << std::setw(12) << "First Name" << 
    std::setw(10) << "Last Name" << std::endl;
    std::cout << "------------------------" << std::endl;
    
    for (const auto & row : result) {  
        std::cout << std::left << std::setw(12) << row[0].c_str();
        std::cout << std::setw(5) << row[1] << std::endl;
    } 

    std::cout << "\n" << "to continue, press enter..." << std::endl;
    showList();
}

void Film::showTwo(){
    mysqlpp::Connection myDB("cse278F2022", "localhost", "cse278F2022",
            "raspberrySeltzer");

    //Selecting the second option's query
    std::cout << "Please type a limit 1-30!" << std::endl;
    std::string limit;
    std::cin >> limit;
    
    
    mysqlpp::Query query = myDB.query();
    query << "SELECT title " 
          << "FROM film " 
          << "WHERE rating = 'PG-13' " 
          << "OR rating = 'R' " 
          << "OR rating = 'NC-17' " 
          << "LIMIT "   limit   " ";
    query.parse();
    mysqlpp::StoreQueryResult result = query.store();

    std::cout << "Here is your selection!\n" << std::endl;
    std::cout << "--First "  limit  " Titles PG-13 to NC-17--\n" << std::endl;
    
    std::cout << std::left <<std::setw(20)<< "Title" << std::endl;
    std::cout << "------------------------------" <<std::endl;
    
    for (const auto & row : result) {
        std::cout << std::left << std::setw(20) << row[0].c_str()<< std::endl;
    } 

    std::cout << "\n" << "to continue, press enter..." << std::endl;
    showList();
}

void Film::showThree(){
    mysqlpp::Connection myDB("cse278F2022", "localhost", "cse278F2022",
            "raspberrySeltzer");

    //bind variable
    std::cout << "Please type 1 for active and 0 for inactive!" << std::endl;
    std::string active;
    std::cin >> active;
    if(active != "1" && active != "0"){
        std::cout << "Wrong!" << std::endl;
        std::cout << "Please type 1 for active and 0 for inactive!" << std::endl;
        std::cin >> active;
    }

    //Selecting the second option's query
    mysqlpp::Query query = myDB.query();
    query << "SELECT Count(*) "
          << "FROM customer "
          << "WHERE active = '"  active   "' "
          << "GROUP BY store_id";
    query.parse();
    mysqlpp::StoreQueryResult result = query.store();
    std::cout << "Here is your selection!\n" << std::endl;
    if(active == "1"){
    std::cout << "--Count of All Active Users Grouped by Store Id--\n" << std::endl;
    std::cout << std::left <<std::setw(20)<< "Active User Ids" << std::endl;
    std::cout << "--------------------" <<std::endl;
    } else {
    std::cout << "--Count of All Inactive Users Grouped by Store Id--\n" << std::endl;
    std::cout << std::left <<std::setw(20)<< "Inactive User Ids" << std::endl;
    std::cout << "--------------------" <<std::endl;
    }
    
    
    for (const auto & row : result) {
        std::cout << std::left << std::setw(20) << row[0].c_str()<< std::endl;
    } 

    std::cout << "\n" << "to continue, press enter..." << std::endl;
    showList();
}

void Film::showFour(){
    mysqlpp::Connection myDB("cse278F2022", "localhost", "cse278F2022",
            "raspberrySeltzer");

    //bind variable
    std::cout << "Please type an actor id that is 1-200!" << std::endl;
    std::string act_id;
    std::cin >> act_id;


    //Selecting the second option's query
    mysqlpp::Query query = myDB.query();
    query << "SELECT film.title, film.film_id, film_actor.actor_id "
          << "FROM film, film_actor "
          << "WHERE film_actor.actor_id = "  act_id  " "
          << "GROUP BY title "
          << "LIMIT 20";
    query.parse();
    mysqlpp::StoreQueryResult result = query.store();
    std::cout << "Here is your selection!\n" << std::endl;
    std::cout << "--First 20 Titles and IDs of Actor Id 25--\n" << std::endl;

    std::cout << std::left <<std::setw(22)<< "Title" << 
                    std::setw(10)<< "Film_id" << std::setw(0)<<"Actor_id" << std::endl;
    std::cout << "----------------------------------------" <<std::endl;
    
    for (const auto & row : result) {
        std::cout << std::left<<std::setw(22)<< row[0].c_str() << std::setw(10) << row[1] << std::setw(0) << row[2].c_str() << std::endl;
    } 

    std::cout << "\n" << "to continue, press enter..." << std::endl;
    showList();
}
#ifndef FILM_H
#define FILM_H
#include <iostream>
#include <string>

class Film {
    
public:
    void showList();
    void showOne();
    void showTwo();
    void showThree();
    void showFour();

private:

};

#endif

// Copyright
// Purpose: Project 4
// Date 11/25/2022
// Author: Colton Sullivan
#define MYSQLPP_MYSQL_HEADERS_BURIED
#include <mysql  /mysql  .h>
#include <iostream> 
#include "/home/sulli313/Project4/Film.h"

int main() {
   int choice;
   showList();

   std::cin >> choice;
    
   if (choice == -1) {
      std::cout << "Bye!" << std::endl;
   }
   while (choice != -1) {
   while ( choice >  4 || choice < -1 || choice == 0 ) {
      std::cout << "The wrong choice!!!" << std::endl;
      std::cout << "" << std::endl;
      std::cout << "to continue, press enter...";
      showList();
      std::cin >> choice;
   }
   if ( choice == 1 ) {
      showOne();
   }
   if ( choice == 2 ) {
      showTwo;
   }
   if ( choice == 3 ) {
      showThree;
   }
   if ( choice == 4 ) {
      showFour;
   }
      std::cin >> choice;
      if ( choice == -1 ) {
      std::cout << "Bye!" << std::endl;
      }
   }
}

When trying to switch the original program to object oriented programming, I ran into the problem of the error "Invalid use of non-static member function" popping up for the showOne, showTwo, showThree, showFour and showList functions.

If there is a way to access the functions that are created in the Film.cpp/Film.h files and use them in the QueryApp.cpp file to run that as the main, please let me know.

I have tried switching it from Film::showOne, Film::showTwo...etc to showOne(); and Film::showOne(); but either the same Invalid use of non-static member function error will show or it will say that it has not be declared in this scope.

CodePudding user response:

Your showSomething() functions are all member functions of the Film type. In particular, because they are not marked as static, they are non-static member functions. That means they operate on an instance of Film:

class C {
  public:
    void a(); // <- non-static member function
    static void b(); // <- static member function
};

void foo() {
  C::b(); // okay, doesn't need an object
  C::a(); // not okay, needs an object
  C object; // instance of C
  object.a(); // okay
  object.b(); // also okay
}

Typically you would give your object some state information or it raises the question why you have a non-static member function to begin with. If you don't need state, make them free functions (i.e., functions that are not member functions) or make them static.

In your case, I suppose it would be helpful to create a database connection in your Film's constructor so you can use the database member in all the functions that need a database connection to function. Something like this:

class Film {
  private:
    mysqlpp::Connection myDB;
  public:
    Film() : myDB("x", "localhost", "y", "z") {}
    // ...
};
  • Related