【问题标题】:Defining static data member of abstract class template inside constructor在构造函数中定义抽象类模板的静态数据成员
【发布时间】:2021-09-25 12:14:42
【问题描述】:

我遇到了一个带有这个抽象类模板定义的考试题:

template <class MusicPlayer>
class SongAbstract {
 protected:
    unsigned long unique_id;
 public:
    SongAbstract() {
      static unsigned long counter = 0;
      unique_id = (counter++);
    }
    int play() const { return MusicPlayer::play(this->unique_id); }
    void stop() const { MusicPlayer::stop(); }
    unsigned long get_id() const { return unique_id; }
 protected:
    virtual void print_info(ostream& os) const = 0;
};

考试题目如下: “从上面的代码可以看出,需要 MusicPlayer 类的实现。 为一个名为 AndroidMusicPlayer 的类编写一个声明,以便程序运行。”

官方解决方案:

class AndroidMusicPlayer {
 public:
    static int play(unsigned long id);
    static void stop();
};

我无法理解构造函数的作用,如果有人能解释以下内容,我将不胜感激:

  1. 在构造函数中定义静态数据成员的目的是什么?
  2. 为什么 AndroidMusicPlayer 中的方法声明为静态?他们访问数据成员 “unique_id”,它不是静态的。

【问题讨论】:

    标签: c++ abstract-class static-methods


    【解决方案1】:

    在构造函数内部定义静态数据成员的目的是什么?

    SongAbstract 构造函数中的counter 变量不是类的成员——它是一个局部变量。被声明为static 意味着它的值将在整个程序运行期间(第一次调用构造函数时)仅被初始化一次(为零)。然后,该值会在每次调用时递增,从而为每个构造的对象分配 实际 成员变量 (unique_id) 的值。

    为什么 AndroidMusicPlayer 中的方法声明为静态?他们访问数据成员“unique_id”,这不是静态的。

    不完全是!它们被传递包含类成员变量的(嗯,一个是);这里的混淆可能是这两个函数与包含类的成员函数具有相同的名称。那个SongAbstract类的两个函数调用了传入的MusicPlayer类中的同名函数;后面的函数必须是static,因为没有将它们的类的实例声明为SongAbstract 的成员——因此我们将unique_id 作为参数传递。

    (语法MusicPlayer::stop()在这里用于调用static类成员;类似的语法可以用于调用非静态成员,但前提是类是基类被调用的那个。)

    【讨论】:

    • 消化了一些,但我明白了。感谢您的解释,它帮助了很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多