使用默认值转发声明 class

Forward declarated class with default value

我有一个前向声明,但想要一个前向声明的实例 class 作为默认值。

所以我的代码大致是这样的:

bar.h

class Foo;

class Bar
{
public:    
    Bar();
    void test(Foo foo = Foo(7));
}

和foo.h

class Foo
{
public:
    Foo(int val);
}

这可能吗?

没有。当你声明一个 method/function 参数是 Foo 时,编译器应该已经知道 Foo 的大小,所以它应该在那个时候已经定义好了。如果您声明但未定义 Foo,您只能使用指向它的指针或引用。

另一个答案中描述的不可能。

除此之外,默认值是代码味道。它们使您的界面变得脆弱

改用方法重载:

class Foo;

class Bar
{
public:    
    Bar();
    void test();           // implement with default value, and document it
    void test(Foo foo);    // implement with user-supplied value
}

bar.cpp中:

#include "foo.h"   // Complete Foo is available here

void Bar::test()
{
    test(Foo(42));
}

void Bar::test(Foo foo)
{
    ...
}