2010-08-28 81 views
3
//node.h 
class node 
{ 
     public: 
      void sort(node n); 

}; 

我还没有试过这个代码。但有趣的是要知道这是一个有效的案例,为什么?成员函数参数可以是相同的类类型吗?

编辑:

这使我另一个问题: 我可以声明这样一个成员函数内FOO?

//FOO.h 
Class FOO 
{ 
    public: 
    void sort(int n) ; 
    void swap(int x , int y); 
} 

//FOO.cpp 

void FOO::sort (int n) 
{ 
    FOO obj; 
    obj.swap(3 , 5) ; 
} 
+1

为什么不呢? ______ – kennytm 2010-08-28 11:12:21

+0

因为它属于同一班级吗?我看起来很奇怪。 – Ahmed 2010-08-28 11:14:24

+1

你纯粹是想通过值作为参数传递一个'node'还是会发现通过'node *'和'node&'奇怪? – Troubadour 2010-08-28 11:25:18

回答

4

现在确定您的问题仅与在会员中传递node有关(而不是通过node*node&),答案仍然是。你甚至可以在课堂内定义成员的身体是你所希望的。

至于为什么,从编译器的角度考虑事情。因为它解析类,所有它真正需要知道的是其中的数据成员以及函数成员签名是什么。在这一点上,没有一个函数成员定义需要解析,所以编译器在看到实际的node作为论点的前景时不会感到惊慌。只有当它完成数据和签名的解析后,它才会返回并实际处理函数成员定义,并且在那一点上它确切知道什么是node

在回答第二个问题时,您可以在成员中定义您的类的实例(出于同样的原因)。

+0

现在,我明白了为什么它是可能的。好答案 。 – Ahmed 2010-08-28 12:16:26

2

是的,你可以。它是一个有效的案例。

你可以找到在C++标准库的一些示例:

string& append(const string& str); 
+2

这不是在C++标准库中:S这是一个多么可怕的函数。 – 2010-08-28 11:22:28

+0

-1。 OP询问了普通类型,而不是指针。 – 2010-08-28 11:42:56

+0

@philip,@Peter:谢谢,已编辑样本。 – mhshams 2010-08-28 11:50:55

5

是的,这是完全有效的。如果你不能这样做,你怎么能写复制构造函数?

一个类似的,但不是有效的情况是,包含与你的类/结构成员相同的类型。

struct Foo 
{ 
    Foo m_foo; 
}; 

你不能这样做,因为它本质上是一个圆形的定义,如果你有:

struct Foo 
{ 
    Foo m_foo; 
    Foo m_bar; 
}; 

然后一个Foo是2 FOOS,这将是4个FOOS,这将是8 Foos等这是没有意义的。

可以,在另一方面,有指向相同的类型:

struct Foo 
{ 
    Foo* m_foo; 
}; 

因为指针foo是不一样的富。指针是一个指针,不管它指向什么,所以没有循环定义或依赖关系。

+0

+1拥有自己会员的好处。 – Skurmedel 2010-08-28 11:22:46

+0

您可以通过使用'const node&'而不是普通的'node'来编写拷贝构造函数。 – 2010-08-28 11:43:59

+0

拷贝构造函数甚至不能通过值获取参数! – UncleBens 2010-08-28 12:04:10

0

这是经常完成的。一个拷贝构造函数是一个很好的例子:

class Apple { 
public: 
    Apple(); 
    Apple(const Apple&); 
}; 
0

简短的回答是肯定的:

长的答案是:

$ 92/2-“一个类在 类关键词{ }中被认为是一个完全定义的对象类型(3.9) (或完整类型)。在类 成员规范中,该类被认为是 函数内完成 机构,默认参数和 构造函数构造函数,初始化 (包括嵌套 类这样的事情),否则视为自己的类 成员的规范内 不完整的“。

相关问题