我可以使用构造函数或对象作为其他类方法的参数默认值吗?

时间:2014-04-08 17:53:34

标签: c++ function object constructor default-value

我试图在方法声明中使用构造函数作为默认值,如下所示:

A.hpp

#include "B.hpp"
class B;
Class A {
friend class B;
    public:
    A();
    ~A();
    const A& operator = (const A& rhs) {
        // assignment operations
        return *this;
    }
    int do_something (B* pB);
};

B.hpp

#include "A.hpp"
class B {
    public:
    B(const A a = A());
    ~B();
};

我的gcc 4.8 C ++ 11编译器对行B(const A a = A());不满意:

  

错误:' A'没有命名类型错误:ISO C ++禁止声明' A'没有类型[-fpermissive]

我需要一个默认值,我不想使用B(A *a = NULL, int z = 0);中的指针。

我还尝试声明一个静态元素并将此对象用作默认值:

A.hpp

#include "B.hpp"
class B;
class A {
    // ...
};

B.hpp

#include "A.hpp"
A a0;
class B {
    public:
    B(const A a = a0);
    ~B();
};

我得到完全相同的错误。

我怎样才能实现这一目标?

编辑:使代码更接近真实代码。

4 个答案:

答案 0 :(得分:4)

你必须在类的右大括号后添加分号。

class A        class A
{              {

} /* bad */    }; /* good */

答案 1 :(得分:1)

将静态变量声明a0移动到A类的定义之后,如下所示:

class A
{
    // class definition
};

A a0;

class B
{
    B (const A a = a0);
};

答案 2 :(得分:1)

我终于找到了问题的根源,这是由于#include的使用不当。

删除A.hpp中的行#include "B.hpp"可以解决问题。 A头只需要B类的前向声明,因为它只使用指向该类的指针。我总结说我有一个循环标题引用。我认为使用friend需要包含类的标题。注意:B类实际上需要访问A类的一些私有成员。

对不起,我的初始帖子很糟糕,不可能从中诊断任何东西,因为它与真实的一个(coorected)不够接近。我下次会坚持使用SSCCE。感谢大家。随着好友总结here,"这真是愚蠢的"。然后我找到了详细解释herehere

答案 3 :(得分:1)