C ++未定义的对象引用

问题描述 投票:1回答:2

对于上下文,我是C ++的新手,我用Java编程。所以我对C ++语法非常糟糕,并且需要愚蠢的答案。

我似乎无法理解为什么我会收到此错误。我检查了多个答案,但它们都是原始变量。我正在使用对象,我猜这是造成一些错误,或者我只是失明。

这是我的课,重点是公共下的3个静态变量

class SuperMarket
{
    private:
        int count;
        int totalService;
        int totalWait;
    public:
        static CustomerQ * regularLine; // this
        static CustomerQ * expressLine; // this
        static EventQ * eventQueue; // this
    // Constructors
        SuperMarket();
    // Destructor
        ~SuperMarket();
    // Accessors
        void start(int choice, string file);
        static void loop();
    // Mutators
};

我在构造函数中初始化静态成员

SuperMarket::SuperMarket() // Constructor
{
    count = 0;
    totalService = 0;
    totalWait = 0;
    regularLine = new CustomerQ(); *error*
    expressLine = new CustomerQ(); *error*
    SuperMarket::eventQueue = new EventQ(); *error*
}

以及我在其他地方做SuperMarket :: Object我得到错误。我尝试使用SuperMarket ::并且没有你可以看到,但我的错误并没有消失。当然,在我的SuperMarket课程之外,我也做SuperMarket ::。

c++ function object
2个回答
3
投票

您只声明了静态类成员;你需要在类之外定义它们,就像使用函数一样。

在您的SuperMarket源文件中:

// You probably want to initialize outside of the constructor, because otherwise it would
// erase your queues whenever a new instance of SuperMarket is created.
CustomerQ* SuperMarket::regularLine = new CustomerQ();
CustomerQ* SuperMarket::expressLine = new CustomerQ();
EventQ* SuperMarket::eventQueue = new EventQ();

SuperMarket::SuperMarket() // Constructor
{
    // Probably don't initialize your statics in here
    // ...

但是,在这种情况下,我不认为这些成员是静态的。静态表示它们应该在包含类的所有实例之间共享;对于不同的SuperMarkets来说,真正有意义的是,所有人共享同一行客户吗?


2
投票

在C ++(和Java)中,成员变量之前的关键字static表示一个类成员,即一个为该类存在一次的变量,而不是该类的每个实例一次。

在C ++中(与Java相比),您必须在类定义之外另外定义一个类成员,即:

class SuperMarket {
        ...
        static CustomerQ * regularLine; // this
        ...
};

// .cpp-file:

CustomerQ * SuperMarket::regularLine = nullptr;

SuperMarket::SuperMarket() // Constructor
{
    count = 0;
    ...
}

但是,请注意,将新对象分配给构造函数内的“类成员”(即在程序中仅存在一次的静态数据成员)(即创建每个对象)很少有意义。

© www.soinside.com 2019 - 2024. All rights reserved.