我正在将代码从Java移植到c ++,我想复制一些匿名功能。
在文件A.h中我有:
class A
{
private:
int a;
class AnonClass;
friend class AnonClass;
};
在文件A.cpp中我有:
namespace
{
class AnonClass
{
public:
AnonClass(A* parent)
{
parent->a = 0; // This doesn't work, a is not accessible
}
}
}
是否可以在C ++中的匿名命名空间中使用某个类?
在Java中,您可以声明匿名类,因此它非常相似。此外,它不会将AnonClass暴露给A.h
的客户答案 0 :(得分:23)
鲜为人知的替代方法是使类Anon成为A的成员类。在A类中,您只需要一行class Anon;
- 没有真正的代码,没有朋友声明。请注意,它在A类中,几乎与Java中一样。在.cpp文件中,您可以编写有关Anon的所有详细信息,但是您不能将其放在匿名命名空间中,而是放在A::
class A::Anon { ..... };
您可以像往常一样拆分A :: Anon的声明和实现,只需记住将A :: A添加到Anon。
Anon类是A的成员,因此可以访问A的所有其他成员。但A的客户端仍然不知道它,并且不会混淆全局命名空间。
答案 1 :(得分:4)
据我所知,你不能。原因:
所以你看,你不能在两个部分打破AnonClass的定义。并且你不能在A类之前和之后定义它。
唯一的选择 - 将A类放入同一个匿名命名空间。此代码有效:
namespace
{
class A
{
public:
A():a(0){};
private:
int a;
friend class AnonClass;
};
class AnonClass
{
public:
AnonClass(A* parent);
};
AnonClass::AnonClass(A* parent)
{
parent->a = 0;
};
}
int main() {
A a;
return 0;
}
我希望这会有所帮助。