//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) ;
}
答案 0 :(得分: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的指针与Foo不同。指针是一个指针,无论它指向什么,因此没有循环定义或依赖。
答案 1 :(得分:4)
现在确定您的问题仅与在成员中传递node
值(而不是传递node*
或node&
)相关,答案仍然是肯定的。你甚至可以在课堂上定义成员的身体。
至于为什么,从编译器的角度考虑事情。因为它解析了类所有它真正需要知道的是它内部的数据成员以及函数成员签名是什么。此时不需要解析任何函数成员定义,因此编译器不会因为看到实际的node
作为参数而感到惊慌。只有当它完成解析数据和签名时,它才会返回并实际处理函数成员定义,并且在那时它确切地知道node
是什么。
在回答第二个问题时,您可以在成员中定义班级的实例(出于同样的原因)。
答案 2 :(得分:2)
你可以在c ++标准库中找到一些样本:
string& append( const string& str );
答案 3 :(得分:0)
经常这样做。复制构造函数就是一个很好的例子:
class Apple {
public:
Apple();
Apple(const Apple&);
};
答案 4 :(得分:0)
简短回答是:
答案很长:
$ 9.2 / 2-“一个班级被认为是一个 完全定义的对象类型(3.9) (或完成类型)在结束时 类说明符。在课堂上 成员规范,类是 在功能内被视为完整 主体,默认参数和 构造函数ctor-initializers (包括嵌套的这类东西 类)。否则被视为 在自己的班级内不完整 构件规格“。