【问题标题】:Error to use of static and static function in C++在 C++ 中使用静态和静态函数时出错
【发布时间】:2016-09-11 09:08:04
【问题描述】:

我是编程初学者,刚开始学 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?

这是我的代码:

#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”的使用无效 字符 *汽车名称; ^

F:\CLion\practice\main.cpp:40:33: 错误:来自这个位置 cout

F:\CLion\practice\main.cpp:11:12: 错误:非静态数据成员 'Car::carNumber' 的使用无效 双车号; ^

F:\CLion\practice\main.cpp:41:35: 错误:来自这个位置 cout

F:\CLion\practice\main.cpp:在函数'int main()'中:

F:\CLion\practice\main.cpp:57:16: 错误:'class Car' 没有名为 'print' 的成员 产品[0].print();

我使用 CLion,提前致谢。

【问题讨论】:

  • 如果一个类变量被标记为static,它不会与它的类的任何实例相关联。你确定这就是你想要的吗?
  • 粗略地说,我想在每次setVal() 函数调用时增加静态变量的 count
  • 我认为您需要采取更小的步骤。您在这里构建了至少四个单独的错误 - 编写更少的代码和更早的测试会简化这一点。

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


【解决方案1】:

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

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

并将countOfInput 的定义放在类之外的 .cpp 文件中(在全局范围内):

int Car::countOfInput = 0;

(如果您想在每次调用Car() 构造函数时将countOfInput 重置为0,您可以在构造函数主体中执行此操作:countOfInput = 0;

【讨论】:

  • 噢噢噢,当地人不错。 :) 似乎是学校的测验问题。
  • 如果我想让我的print 函数成为friend,我该怎么办?
  • @DeathProgrammer 在类内声明它为友元,并像往常一样在外面定义它。
【解决方案2】:

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

关键字friendprint()前面,使其成为非成员函数(注意最后的错误信息)然后不能直接访问成员变量。根据用法应该是成员函数,所以去掉关键字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;
 }

【讨论】:

  • 并将const放在开头{之前。
  • 没有friend 甚至const 甚至把const 放在开始之前,还不行。
  • 给我这个错误:F:/CLion/practice/main.cpp:31: undefined reference to `Car::countOfInput'
  • @DeathProgrammer 这是另一个问题。查看 tuple_cat 的回答。
【解决方案3】:

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

   Car() {
        static int countOfInput = 0;
        char carName = {'X'};
        double carNumber = 0;
    }

相反,它声明了三个局部变量并将它们设置为值。你想要的是:

   Car() 
       : carName(nullptr)
       , carNumber(0.0) 
   {
   }

然后setValue 正在将字符串复制到this-&gt;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;

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多