2011-06-16 71 views
2

我正在整合某人的代码,它将所有内容都包含在一个cpp文件中。主要代码是这样的:嵌套类作为C++中成员函数的参数

class Outer 
{ 
public: 
    struct Inner 
    { 
     struct In_inner 
     { 
     ... 
     } 
    } 
    int func(Inner& inn, Inner::In_inner& in_inn) 
    { 
     ... 
    } 
} 

为了分离,我应该为“Inner”参数添加“Outer ::”,如下所示?

在头文件

class Outer 
{ 
public: 
    struct Inner 
    { 
     struct In_inner 
     { 
     ... 
     } 
    } 
    int func(Inner& inn, Inner::In_inner& in_inn); 
} 

和cpp文件

int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn) 
{ 
    ... 
} 

这听起来有点不可思议,我认为参数列表是从声明有点不同。另外,我是否可以将所有内容都保存在同一个文件中,并将其作为头文件包含在内?

感谢您的任何意见!

+0

你有没有做过测试自己吗? – 2011-06-16 13:41:04

+0

nope,我需要一些专业知识;-) – pepero 2011-06-16 13:52:13

回答

4
int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn) 

是的。你已经正确地写了这个。如果您在课堂外定义它,则必须添加Outer::


这听起来有点不可思议,我认为参数列表是从声明

这是正常情况有点不同。该功能在课堂外定义。你不在班上。因此它看起来有点不同。

但是,如果你不希望它看起来不同,那么你可以写在声明Outer::为好,如下图所示:

class Outer 
{ 
public: 
    //... 
    int func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn); 
}; 

这是罚款,而且会工作,因为Outer是注入名称,它也可以在类中使用。

struct A 
{ 
    struct B { 
     struct C {}; 
    }; 

    B b1; //okay - as usual 
    A::B b2; //this is also okay - not so usual though 

    B::C c1; //okay - as usual 
    A::B::C c2; //this is also okay - not so usual though 

    A::A::A::A::A::A *pA; //this is very very unsual. But it is also okay! 
}; 

最后一行是好的,因为名称AA类的定义内注射。因此它变得递归可用。

看到它编译罚款:

+1

感谢你Nawaz为你的解释性答案。 – pepero 2011-06-16 13:54:27

+0

@pepero:请参阅我答案中的编辑。 – Nawaz 2011-06-16 14:00:13

+1

好开心!感谢您展示这一点。 – pepero 2011-06-16 14:03:44

1

在类声明/定义中,你在Outer ::的范围内。在那之外(在你的.cpp中),你不是。 是的,您可以在头中保留函数定义:它是一个隐式内联。

2

参数列表没有区别;类型是相同的。在头文件中显式限定std::成员并在源文件中使用using namespace std;并不罕见。这基本上是一样的。

无论您如何限定类型,只要它们指的是相同类型即可。而且,由于源文件中不包含Outer的范围,因此在此处需要显式限定条件。

+0

感谢您的评论!这解除了我的怀疑。 – pepero 2011-06-16 13:49:41