1

我在这里浏览了与静态成员变量相关的所有线程,但不幸的是,这无法帮助我找出原因。

这就是问题:

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;
}
4

2 回答 2

2

很近!只是改变

 //dvd_db::cnt=0;

至:

int dvd_db::cnt=0;

为什么?一个类有两部分:声明和定义。通常声明放在 .h 文件中,定义放在 .cpp 文件中。由于各种原因,cpp 允许您也将函数定义放在声明中。正如您所做的那样,这对于单个文件示例来说很好。

但这不适用于静态:静态只能有一个定义(根据定义,哈哈),并且必须在声明之外。

在你的班级声明中,你告诉任何看到它的人“只有一个 int cnt”。现在您还必须将该 int 放在某个地方。这是在类声明之外完成的,并且只能完成一次。

每次实例化类时都会分配非静态成员,因此在创建类的实例之前它们不需要位置。函数介于两者之间,它们是代码,因此是只读的。所以编译器可以很聪明。将它们放在类声明中允许编译器在声明中看到它们并内联它们。但是大的也应该放在声明之外。

于 2013-06-29T08:40:01.110 回答
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;

就是这样..您的链接问题将得到解决。

于 2013-06-29T08:37:29.167 回答