2016-05-15 50 views
0

我是编程的初学者,开始使用C++。我有问题使用我的静态变量。我读了关于在各种相同的问题中使用静态变量,但我明白这只是Car :: countOfInput;。从下一篇:在C++中使用静态和静态函数的错误

  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?

这是我的代码:

#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();

我用的克利翁,在此先感谢。

+1

如果一个类变量被标记为'static',则它不与其类的_any_实例关联。你确定这就是你想要的吗? – erip

+0

粗略地说,我希望每次调用setVal()函数时增加我的静态变量** count **。 –

+2

我认为你需要采取更小的步骤。你已经在这里建立了至少4个单独的错误 - 编写更少的代码和测试早些时候会简化这个。 –

回答

3

Car()内部的变量声明是局部变量,而不是成员变量的初始化。要初始化成员变量,只是这样做(这是一个member initializer list):

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

和放countOfInput定义在.cpp文件中类外(在全球范围内):

int Car::countOfInput = 0; 

(如果你想每次Car()构造函数被调用时重置countOfInput0,你可以做的是,在构造函数体:countOfInput = 0;

+0

Ooooo,很好的与当地人交流。 :)看起来像来自学校的测验问题。 – erip

+0

谢谢,所有的错误都没有了。 –

+0

如果我想让我的'print'功能成为'friend',我该怎么办? –

2

错误消息与静态变量或静态方法无关。

关键字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; 
} 
+1

并把'const'放在开头'{'。 – emlai

+0

没有'friend'甚至'const',甚至在beginninng之前放置'const',还没有工作。 –

+0

给我这个错误:_F:/CLion/practise/main.cpp:31:对Car :: countOfInput'_的未定义引用。 –

2

哦,亲爱的。你有一些问题。首先,你的构造函数不会初始化任何成员变量。

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;