【问题标题】:Can I use a constructor or an object as an other class method's argument default value?我可以使用构造函数或对象作为其他类方法的参数默认值吗?
【发布时间】:2014-05-21 14:20:31
【问题描述】:

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

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]

我需要 a 的默认值,并且我不想使用 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();
};

我得到完全相同的错误。

请问我该如何实现?

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

【问题讨论】:

  • 这是你的真实代码吗?类定义后没有分号。
  • 对不起,我写例子的时候错过了。原代码是对的。所以,原来的问题还是一样的。
  • 没有足够的信息。 SSCCE 在这里很有用。
  • 您的 A 构造函数是 private。除此之外,您发布的代码没有错误。 ideone.com/c5esGG
  • 这在A.cpp 中不起作用,因为在处理B.hpp 时,A 尚未定义。 A 必须在您要编写 B(A a = A()) 时完全定义。

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


【解决方案1】:

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

class A        class A
{              {

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 类声明在header中,所以是正确的。
    • 我不明白正确的意思。当编译器读取A a0这一行时,如果此时没有将标识符A声明为类,编译器会报错。
    • 问题不在于不清楚。我认为这是导致错误的原因。在您的代码中更改它,看看它是否有效。
    【解决方案3】:

    终于找到问题的根源了,是#include使用不当造成的。

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

    对不起,我最初的帖子很糟糕,因为它与真实的(协调)不够接近,所以无法从中诊断出任何东西。下次我会坚持SSCCE。感谢大家。正如好友总结here,“那真是太愚蠢了”。然后我找到了详细的解释here和here。

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 2021-06-15
      • 2015-04-20
      • 2017-04-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多