Reputation: 896
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:
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
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
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
Reputation: 28987
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