C++中static和static函数的使用错误
Error to use of static and static function in C++
我是编程初学者,刚开始学C++。我在使用我的静态变量时遇到问题。我在各种相同的问题中阅读了静态变量的使用,但我只理解这个 Car::countOfInput;。从下面 post:
How do I call a static method of another class
C++ Static member method call on class instance
How to call static method from another class?
这是我的代码:
#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\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();
我使用 CLion,提前致谢。
错误消息与静态变量或静态方法无关。
关键字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;
}
Car()
里面的变量声明是局部变量,不是成员变量的初始化。要初始化成员变量,只需执行此操作(它是 member initializer list):
Car() : carName("X"), carNumber(0) {}
并将 countOfInput
的定义放在 .cpp 文件中的 class 之外(在全局范围内):
int Car::countOfInput = 0;
(如果你想在每次调用 Car()
构造函数时将 countOfInput
重置为 0
,你可以在构造函数主体中执行此操作:countOfInput = 0;
)
哦,亲爱的。你有很多问题。首先,你的构造函数没有初始化任何成员变量。
Car() {
static int countOfInput = 0;
char carName = {'X'};
double carNumber = 0;
}
相反,它声明了三个局部变量并将它们设置为值。你想要的是:
Car()
: carName(nullptr)
, carNumber(0.0)
{
}
然后 setValue
将字符串复制到 this->carName
指向的内存中,但它未初始化,因此可能在任何地方。另外,在初始化str
之前strlen(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
不是朋友(并使其成为 const)。
void print() const {
...
最后你需要定义coutOfInput
。你已经声明了它,但你还需要一个定义。在任何函数之外做:
int Car::countOfInput = 0;
我是编程初学者,刚开始学C++。我在使用我的静态变量时遇到问题。我在各种相同的问题中阅读了静态变量的使用,但我只理解这个 Car::countOfInput;。从下面 post:
How do I call a static method of another class
C++ Static member method call on class instance
How to call static method from another class?
这是我的代码:
#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\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();
我使用 CLion,提前致谢。
错误消息与静态变量或静态方法无关。
关键字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;
}
Car()
里面的变量声明是局部变量,不是成员变量的初始化。要初始化成员变量,只需执行此操作(它是 member initializer list):
Car() : carName("X"), carNumber(0) {}
并将 countOfInput
的定义放在 .cpp 文件中的 class 之外(在全局范围内):
int Car::countOfInput = 0;
(如果你想在每次调用 Car()
构造函数时将 countOfInput
重置为 0
,你可以在构造函数主体中执行此操作:countOfInput = 0;
)
哦,亲爱的。你有很多问题。首先,你的构造函数没有初始化任何成员变量。
Car() {
static int countOfInput = 0;
char carName = {'X'};
double carNumber = 0;
}
相反,它声明了三个局部变量并将它们设置为值。你想要的是:
Car()
: carName(nullptr)
, carNumber(0.0)
{
}
然后 setValue
将字符串复制到 this->carName
指向的内存中,但它未初始化,因此可能在任何地方。另外,在初始化str
之前strlen(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
不是朋友(并使其成为 const)。
void print() const {
...
最后你需要定义coutOfInput
。你已经声明了它,但你还需要一个定义。在任何函数之外做:
int Car::countOfInput = 0;