在C ++

时间:2016-05-15 14:13:29

标签: c++ static static-methods clion non-static

我是编程的初学者,在弱者之前启动C ++。我有问题使用我的静态变量。我在各种相同的问题中读到了静态变量的使用,但我理解这个 Car :: countOfInput; 。从下面的帖子:

  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?

  4. 这是我的代码:

    #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,提前谢谢。

3 个答案:

答案 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;