2013-06-29 5 views
1

Здесь я просмотрел все темы, связанные с статической переменной-членом, но, к сожалению, это не помогло мне выяснить причину.Ошибка переменной статического члена класса C++

это проблема:

1) Определить имя класса DVD_DB. Включите следующих участников.

DATA MEMBERS: 
Name of DVD – private character array, size 10 
Price – private double variable 
Quantity – private int variable 
A private static int variable to keep track of how many DVD have been created so far. 
MEMBER FUNCTIONS: 
To assign initial values 
To set price and quantity 
To get price and quantity 
To Print DVD 
To display how many DVD has been created so far. 

В основной функции используется массив DVD и демонстрируется магазин DVD. Т.е. пользователь может выбрать DVD & купите его, , когда продается DVD. Количество падает.

и, я написал этот код для его решения. Но стоит сталкиваться с проблемой при создании этого кода. Компилятор говорит о неопределенной ссылке везде, где я использовал статическую переменную cnt. Еще один вопрос, как я хочу сначала установить cnt на 0, как это сделать, поскольку это переменная?

и что можно сделать для решения неопределенной проблемы с ссылкой?

class dvd_db{ 

private: 
    string name; 
    float price; 
    int quantity; 
    static int cnt; 

public: 


    dvd_db() 
    { 
     name=""; 
     price=0; 
     quantity=0; 
     cnt++; //to count the total number of dvds 
    } 

    dvd_db(string str,float p,int q) 
    { 
     name = str; 
     price = p; 
     quantity = q; 
     // cnt=0; 
     cnt+=q; 
    } 

    void set_name(string str) 
    { 
     name = str; 
    } 
    string get_name(void) 
    { 
     return name; 
    } 
    void set_price(float p) 
    { 
     price = p; 
    } 
    float get_price(void) 
    { 
     return price; 
    } 
    void set_quantity(int q) 
    { 
     quantity = q; 
     cnt+=q; 

    } 
    int get_quantity(void) 
    { 
     return quantity; 
    } 
    void show_info(void) 
    { 
     cout<<"Name if the DVD: "<<name<<endl; 
     cout<<"Price: "<<price<<endl; 
     cout<<"Available Quantity: "<<quantity<<endl; 

    } 
    void total(void) 
    { 
     cout<<"Total number of dvd is: "<<cnt<<endl; 
    } 

    void buy(void) 
    { 
     if(quantity>0){ 
      quantity--; 
      cnt--; 
      cout<<"Thanks for purchasing this item"<<endl; 

     } 
     else 
      cout<<"This Item can not be bought."<<endl; 

    } 
}; 
//dvd_db::cnt=0; 

int main() 
{ 
    dvd_db dvd[3]; 

    int i,j,k,n; 

    dvd[0].set_name("A Beautiful Mind"); 
    dvd[0].set_price(50.00); 
    dvd[0].set_quantity(10); 

    dvd[1].set_name("October Sky"); 
    dvd[1].set_price(50.00); 
    dvd[1].set_quantity(15); 

    dvd[2].set_name("Shawshank Redemption"); 
    dvd[2].set_price(50.00); 
    dvd[2].set_quantity(100); 



    cout<<"Welcome to Banani International Movie House"<<endl; 
    cout<<"Enter the serial no. to buy an item, -1 to view total no. of dvd(s), or enter 0 to quit."<<endl; 
    cout<<"Here is our collection:"<<endl<<endl<<endl<<endl; 

    for(i=0; i<3; i++){ 
     cout<<"serial no. "<<i+1<<endl; 
     cout<<"------------------------------------"<<endl; 
     dvd[i].show_info(); 

    } 

    cout<<"Enter: "<<endl; 

    while(cin>>n) 
    { 
     if(n==-1){ 
      dvd[0].total(); 
      cout<<"Enter: "<<endl; 
      continue; 
     } 
     dvd[n-1].buy(); 
     cout<<"Enter: "<<endl; 
    } 
    return 0; 
} 
+0

Возможный дубликат [Неопределенная ссылка на статический член класса] (http://stackoverflow.com/questions/272900/undefined-reference-to-static-class-member) – juanchopanza

ответ

0

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

class Foo { 

    private: 
     static int a; 

    }; 

    int Foo::a = 0; 

    int main() { 
     Foo foo; 
    } 

Так что в вашем случае все, что вам нужно сделать, это раскомментировать линия // dvd_db :: cnt = 0;

и положить Int перед ним:

int dvd_db::cnt = 0; 

вот это .. ваши связывающие вопросы будут решены.

2

Так близко! Просто измените

//dvd_db::cnt=0; 

To:

int dvd_db::cnt=0; 

Почему? Класс состоит из двух частей: Декларация и определение. Обычно декларация входит в файл .h и определение в файле .cpp. По разным причинам cpp позволяет также определять определения функций в декларации. Как вы это делаете, и что отлично подходит для примера с одним файлом.

Но это не работает для статики: статика может иметь только одно определение (по определению, ха-ха), и оно должно быть вне декларации.

В объявлении вашего класса вы говорите любому, кто смотрит на него, «есть один и только один int cnt». Теперь вам также нужно разместить это место где-то. И это делается за пределами декларации класса и должно выполняться только один раз.

Нестатические элементы распределяются каждый раз, когда класс подвергается инстинктам, поэтому им не нужно место, прежде чем вы создадите экземпляр класса. Функции находятся между ними, они являются кодом и, следовательно, доступны только для чтения. Поэтому компилятор может быть умным. Чтобы поместить их в объявление класса, он позволяет компилятору видеть их с объявлением и встраивать их. Но большие должны быть поставлены за пределы декларации.

+0

Спасибо, что решила мою проблему. – prodhan

+0

Хорошо :) Пожалуйста, также подумайте о принятии ответа, если это было полезно, поэтому вопрос закрывается. – starmole