Death Programmer
Death Programmer

Reputation: 896

Error to use of static and static function in C++

i am beginner in programming, start C++ one weak ago. i have problem to use of my static variable. i read about use of static variable in various same question but i understand just this Car::countOfInput;. from below post:

  1. How do I call a static method of another class

  2. C++ Static member method call on class instance

  3. How to call static method from another class?

this is my code:

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

class Car{
    private:
        static int countOfInput;
        char   *carName;
        double carNumber;
    public:
        Car() {
            static int countOfInput = 0;
            char carName = {'X'};
            double carNumber = 0;
        }

        void setVal(){
            double number;

            cout << "Car Name: ";
            char* str = new char[strlen(str) + 1];
            cin>>str;
            strcpy(carName, str);

            cout << endl << "Car Number: ";
            cin >> number; cout << endl;
            carNumber = number;

            Car::countOfInput += 1;
       }

       friend void print(){
            if(Car::countOfInput == 0){
                cout << "Error: empty!";
                return;
            }
            cout << "LIST OF CarS" << endl;
            cout << "Car Name: " << carName << "\t";
            cout << "Car Number: " << carNumber << endl;
      } const

      void setCarNumber(int x){carNumber = x;}
      int  getCarNumber(){return carNumber;}

      void setcarName(char x[]){strcpy(carName, x);}
      char getcarName(){return *carName;}

      int getCountOfInput(){return countOfInput;}
      void setCountOfInput(int x){countOfInput = x;}
};

int main(){
    Car product[3];
    product[0].setVal();
    product[0].print();

    getch();
    return 0;
}

when i run this:

F:\CLion\practise\main.cpp: In function 'void print()':

F:\CLion\practise\main.cpp:10:13: error: invalid use of non-static data member 'Car::carName' char *carName; ^

F:\CLion\practise\main.cpp:40:33: error: from this location cout << "Car Name: " << carName << "\t"; ^

F:\CLion\practise\main.cpp:11:12: error: invalid use of non-static data member 'Car::carNumber' double carNumber; ^

F:\CLion\practise\main.cpp:41:35: error: from this location cout << "Car Number: " << carNumber << endl; ^

F:\CLion\practise\main.cpp: In function 'int main()':

F:\CLion\practise\main.cpp:57:16: error: 'class Car' has no member named 'print' product[0].print();

I use CLion, Thanks in advance.

Upvotes: 1

Views: 3324

Answers (3)

Emil Laine
Emil Laine

Reputation: 42828

The variable declaration inside Car() are local variables, not initializations of the member variables. To initialize the member variables, just do this (it's a member initializer list):

Car() : carName("X"), carNumber(0) {}

and put the definition of countOfInput outside the class in a .cpp file (in global scope):

int Car::countOfInput = 0;

(If you want to reset countOfInput to 0 every time the Car() constructor is called, you can do that in the constructor body: countOfInput = 0;)

Upvotes: 4

songyuanyao
songyuanyao

Reputation: 172924

The error messages have nothing to do with static variables or static methods.

The keyword friend is in front of print(), make it a non-member function (note the last error message) and then can't access the member variables directly. According to the usage it should be a member function, so just remove the keyword friend.

And as @tuple_cat suggested, const should be put before the beginning {.

void print() const {
     if(Car::countOfInput == 0){
         cout << "Error: empty!";
         return;
     }
     cout << "LIST OF CarS" << endl;
     cout << "Car Name: " << carName << "\t";
     cout << "Car Number: " << carNumber << endl;
 }

Upvotes: 3

Oh dear. You have a number of problems. Firstly, your constructor doesn't initialize any of the member variables.

   Car() {
        static int countOfInput = 0;
        char carName = {'X'};
        double carNumber = 0;
    }

Instead it is declaring three local variables and setting them to values. What you want is:

   Car() 
       : carName(nullptr)
       , carNumber(0.0) 
   {
   }

Then setValue is copying the string into the memory pointed at by this->carName, but that is uninitialized, so could be anywhere. Also, strlen(str) before you initialize str is doomed to failure. Make carName a std::string, then you don't need to construct it, and the code becomes:

   Car() 
       : carNumber(0.0) 
   {
   }

   void setVal(){

        cout << "Car Name: ";
        cin >> carName;

        cout << endl << "Car Number: ";
        cin >> carNumber; cout << endl;

        Car::countOfInput += 1;
   }

Next, you need to make print not be a friend (and make it const).

   void print() const {
   ...

Finally you need to define coutOfInput. You have declared it, but you also need a definition. Outside any function do:

int Car::countOfInput = 0;

Upvotes: 3

Related Questions