2016-05-15 8 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();

Я использую CLion, спасибо заранее.

+1

Если переменная класса помечена 'static', она не связана с экземпляром _any_ своего класса. Вы уверены, что это то, что вы хотите? – erip

+0

Грубо говоря, я хочу увеличить ** count ** моей статической переменной каждый раз, когда 'setVal()' вызов функции. –

+2

Думаю, вам нужно сделать гораздо меньшие шаги. Здесь вы собрали массу по меньшей мере четырех отдельных ошибок: упростить это было бы сокращение количества кода и тестирования ранее. –

ответ

3

Переменная декларация внутри Car() являются локальными переменными, а не инициализацию переменных-членов. Для инициализации переменных-членов, просто сделать это (это member initializer list):

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

и поставить определение countOfInput вне класса в файле .cpp (в глобальном масштабе):

int Car::countOfInput = 0; 

(Если вы хотите сбросить countOfInput к 0 каждый раз, когда Car() конструктор вызывается, вы можете сделать это в теле конструктора: 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' и даже поставить '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 СТАНД :: строка, то вам не нужно построить его, и код становится:

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;