源文件中的嵌套类定义

39

如果我有一个类内嵌的类,代码如下:

  class MyClass
  {
    class NestedClass
    {
    public:
      // nested class members AND definitions here
    };

    // main class members here
  };

目前,MyClass 的定义在 CPP 文件中,但是 NestedClass 的定义在头文件中,因此我无法在 CPP 文件中声明函数/构造函数。

那么我的问题是,如何在 cpp 文件中定义 NestedClass 的函数?如果不能,原因是什么(如果是这种情况,我有一个模糊的想法,但我想要一个好的解释)?结构体也是这样吗?

1个回答

68

你可以这样做。如果你的内部类有一个像这样的方法:

  class MyClass   {
    class NestedClass
    {
    public:
      void someMethod();
    };

    // main class members here
  };

如果你想定义它,可以像这样在.cpp文件中定义:

void MyClass::NestedClass::someMethod() {
   // blah
}

在C++中,结构体(Structures)几乎与类(Classes)相同,只是默认为'public'。在所有其他方面,它们都像类一样处理。

正如评论中所指出的,您可以声明一个内部类,例如:

class MyClass   {
    class NestedClass;
    // blah
};

然后在实现文件中定义它:

class MyClass::NestedClass {
  // etc.
};

“not ... like other inner classes” 的意思是什么? - Cheers and hth. - Alf
@Alf:我承认我对PIMPL惯用语并不是很熟悉(或者至少不熟悉那个术语),但从我所看到的来看,它通常是关于包含一个指向私有实现的指针,而不是一个内部类? - sje397
1
私有实现通常是一个内部类,只是声明。 - Cheers and hth. - Alf
声明后跟在cpp定义中会导致错误。例如,在优先队列中使用内部声明的cpp定义嵌套结构时出现“未定义类型”错误。在头文件中定义结构不会出错... - Noein
@Noein 你需要使用类名和其嵌套的父类来限定定义。这个网站上肯定有相关问题可以解决这个问题。 - sje397
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接