假设C ++类具有
形式的构造函数(以及其他构造函数)Foo::Foo( FILE *fp ) { etc... }
现在我想创建一个表单
的包装类class WFoo {
Foo::Foo A;
Foo::Foo B;
};
使用构造函数
WFoo::WFoo(FILE *fa, FILE *fb) {
A(fa), B(fb);
}
WFoo的定义有什么问题? 提前谢谢。
答案 0 :(得分:9)
这没有任何意义......
class WFoo {
Foo::Foo A;
Foo::Foo B;
};
你的意思是......
class WFoo {
public:
Foo A;
Foo B;
WFoo(FILE* fa, FILE* fb);
};
WFoo::WFoo(FILE* fa, FILE* fb) :
A(fa), B(fb)
{
}
还要记住,字段的初始化不是按照您在构造函数中读取的顺序而是按照它们在类中声明的顺序进行初始化!
因此...
#include <iostream>
struct XFoo
{
XFoo(const char* s) { std::cout << s << std::endl; }
};
struct YBar
{
XFoo a;
XFoo b;
YBar() : a("A"), b("B") {}
};
struct ZBar
{
XFoo b;
XFoo a;
ZBar() : a("A"), b("B") {}
};
int main()
{
YBar y;
ZBar z;
return 0;
}
将打印出来......
A
B
B
A
答案 1 :(得分:2)
这是一个初始化列表,但语法已关闭。尝试:
WFoo::WFoo(FILE* fa, FILE* fb) : A(fa), B(fb)
{
}
答案 2 :(得分:1)
您正在寻找的语法是:
WFoo::WFoo(FILE *fa, FILE *fb) : A(fa), B(fb) { ... }
并且,除非Foo
位于名为Foo
的名称空间中,WFoo
不是:
class WFoo {
Foo A;
Foo B;
};
答案 3 :(得分:1)
如果你发布的代码是psudocode,那么WFoo
的定义就会出现 nothing 错误。
另一方面,如果您发布的代码不是psudocode,而是您尝试编译的实际代码&amp;运行,然后这是WFoo
:
Foo A;
不Foo::Foo A
,除非Foo
位于名为Foo
的名称空间中(这会很糟糕)这就是你想要的:
WFoo::WFoo(FILE* fa, FILE* fb)
: A(fa), B(fb)
{
}
请注意,初始化列表位于构造函数的主体之前。