【问题标题】:What does "class" mean in a constructor?构造函数中的“类”是什么意思?
【发布时间】:2012-10-10 14:34:32
【问题描述】:

我看到了这个构造函数:

MyClass(class MyOtherClass* = 0) {}

class 关键字是什么意思?构造函数是否采用MyOtherClass 指针并将参数默认为空指针?

【问题讨论】:

  • 哇!没见过这样的语法,有意思,+1
  • @KirilKirov:但你确实看到了struct tm*,不是吗?
  • @MatthieuM。 - 绝对地。写这篇评论时,我的想法完全一样:)

标签: c++ class constructor


【解决方案1】:

这是一个前向声明。 MyOtherClass 在此上下文中使用之前不必定义,因此前向声明就足够了。 =0 是参数的默认值。

不需要完整定义的案例集思广益:

  • 成员指针
  • 成员参考
  • 方法参数类型
  • 方法返回类型

比较以下:

//MyClass.h
class MyClass
{
    MyClass(MyOtherClass* = 0) {} //doesn't compile
                                  //doesn't know what MyOtherClass is
};

//MyClass.h
class MyClass
{
    MyClass(class MyOtherClass* = 0) {} //compiles, MyOtherClass is declared
};

//MyClass.h
class MyOtherClass;   //declare MyOtherClass
class MyClass
{
    MyClass(MyOtherClass* = 0) {} //compiles, declaration available
};

【讨论】:

  • 只是一个澄清点。 MyOtherClass 不必在这里完全定义,因为只需要一个指向它的指针。前向声明告诉编译器它需要知道的关于MyOtherClass 的所有信息,以便生成指向它的指针。
  • @JohnDibling 不限于指针。在这种情况下,它可以工作,因为它是一个参数。据我所知,您只需要对象成员的完整定义(指针成员、引用、参数和返回类型不需要完整定义)。
  • 如果我可以简单地包含声明 MyOtherClass 的头文件,我为什么要这样做?
  • @Andreas:因为你想最小化你的包含。
  • 通常的问题是前向声明事物而不是包含适当的标头,当类型证明不容易前向声明时 std::string 就是这样的一个例子,而不是你无论如何,可以将 anything 前向声明到命名空间 std,即使它不是模板实例化的 typedef。但关键是你不能转发声明class Foo;,除非Foo 是由class Foo { ... }; 定义的。来自其他人模块的 IMO 前向声明类型是不可接受的抽象泄漏,YMMV。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2016-03-17
  • 2015-04-11
  • 2013-04-25
  • 1970-01-01
相关资源
最近更新 更多