我是编程的初学者,在弱者之前启动C ++。我有问题使用我的静态变量。我在各种相同的问题中读到了静态变量的使用,但我理解这个 Car :: countOfInput; 。从下面的帖子:
这是我的代码:
#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;
}
当我运行时:
F:\ CLion \ practice \ main.cpp:在函数'void print()'中:
F:\ CLION \ practice \ main.cpp:10:13:错误:无效使用非静态数据成员'Car :: carName' char * carName; ^
F:\ CLION \ practice \ main.cpp:40:33:错误:从这个位置 cout&lt;&lt; “汽车名称:”&lt;&lt; carName&lt;&lt; “\ t” 的; ^
F:\ CLION \ practice \ main.cpp:11:12:错误:无效使用非静态数据成员'Car :: carNumber' 双车数; ^
F:\ CLION \ practice \ main.cpp:41:35:错误:从这个位置 cout&lt;&lt; “汽车编号:”&lt;&lt; carNumber&lt;&lt; ENDL; ^
F:\ CLion \ practice \ main.cpp:在函数'int main()'中:
F:\ CLION \ practice \ main.cpp:57:16:错误:'class Car'没有名为'print'的成员 产物[0] .PRINT();
我使用CLion,提前谢谢。
答案 0 :(得分:4)
Car()
内的变量声明是局部变量,而不是成员变量的初始化。要初始化成员变量,只需执行此操作(它是member initializer list):
Car() : carName("X"), carNumber(0) {}
并将countOfInput
的定义放在.cpp文件中(在全局范围内):
int Car::countOfInput = 0;
(如果您想在每次调用countOfInput
构造函数时将0
重置为Car()
,您可以在构造函数体中执行此操作:countOfInput = 0;
)
答案 1 :(得分:3)
错误消息与静态变量或静态方法无关。
关键字friend
位于print()
前面,使其成为非成员函数(请注意上一条错误消息),然后无法直接访问成员变量。根据用途,它应该是成员函数,因此只需删除关键字friend
。
正如@tuple_cat建议的那样,const
应该放在开头{
之前。
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;
}
答案 2 :(得分:3)
Car() {
static int countOfInput = 0;
char carName = {'X'};
double carNumber = 0;
}
相反,它声明了三个局部变量并将它们设置为值。你想要的是:
Car()
: carName(nullptr)
, carNumber(0.0)
{
}
然后setValue
正在将字符串复制到this->carName
指向的内存中,但这是未初始化的,因此可能在任何地方。此外,在初始化strlen(str)
之前str
注定要失败。将carName
设为std :: string,然后您不需要构造它,代码变为:
Car()
: carNumber(0.0)
{
}
void setVal(){
cout << "Car Name: ";
cin >> carName;
cout << endl << "Car Number: ";
cin >> carNumber; cout << endl;
Car::countOfInput += 1;
}
接下来,您需要让print
不是朋友(并使其成为常量)。
void print() const {
...
最后,您需要定义coutOfInput
。你已经声明了它,但你也需要一个定义。在任何功能之外做:
int Car::countOfInput = 0;