【问题标题】:C++ Undefined Reference with objects带有对象的 C++ 未定义引用
【发布时间】:2018-02-28 20:06:08
【问题描述】:

对于上下文,我是 C++ 的新手,我用 Java 编程。因此,我对 C++ 语法非常不满意,并且需要简化答案。

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

这是我的课,重点是public下的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::。

【问题讨论】:

  • 看来CustomerQEventQ还没有声明。此外,由于它们对类来说是静态的,所以在实例的构造函数中设置它们是很奇怪的。
  • 除非绝对必要(例如链表),否则您需要改掉使用new 的习惯。这是 Java 和 C++ 之间的一个主要区别。顺便说一句,C++ 没有垃圾收集。
  • 是的,对于更多上下文,这些是队列和 PriorityQueues(秘密排序的链表)

标签: c++ function object


【解决方案1】:

你只声明了你的静态类成员;您需要像处理函数一样在类之外定义它们。

在您的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 共享相同的客户线真的有意义吗?

【讨论】:

  • 非常感谢它的工作,我正在使用静态,因为我计划让其他类访问完全相同的队列。 edit 我也只有 1 个超市
  • @TeenCoder 我建议在此处遵循单例模式,而不是您在此处使用的一些混合单例。换句话说,创建一个静态 Supermarket 并将这些静态变量变成成员。
  • @SandyChapman 当我声明 SuperMarket 时,我声明它是静态的。这是不好的编程习惯吗?
  • @TeenCoder 我建议对单例模式进行一些调查。有些人认为它是一种反模式,但它仍然很常见,当您实际上只需要一个实例时,它是实现它的一种简单方法。更多信息stackoverflow.com/a/271104/1270148
【解决方案2】:

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

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

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

// .cpp-file:

CustomerQ * SuperMarket::regularLine = nullptr;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2011-02-07
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多