使用默认值转发声明 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)
{
...
}
我有一个前向声明,但想要一个前向声明的实例 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)
{
...
}