我有两个类:其中一个类型不完整,第二个类需要使用不完整类型。有没有办法以类似于引用外部对象的方式引用“外部类型”?
编辑:关于我的课程结构的详细信息。
不幸的是我也不能使用指针。我的代码看起来像这样:
class CompleteA {
private:
friend CompleteB;
struct IncompleteA;
boost::shared_ptr<IncompleteA> data_;
};
class CompleteB {
public:
void SomeFct(CompleteA& a) {
// I need to access a member of the incomplete type
a.data_->someMember;
}
};
我可以有一个单独的标题和源文件对,但这在我的情况下会有点过分。不完整类型只是一个包含一个成员的结构;我用它来隐藏实现。 (但是,如果没有其他选择,我将采用单独的标题......)
关于我对朋友的使用,请忽略它并专注于我正在寻求帮助的内容。我一直在思考是否应该在这里使用朋友,我得出的结论是,使用getter(而不是朋友)会暴露实现。
答案 0 :(得分:6)
使用前瞻声明。
在yourotherclass.h中:
class IncompleteClass;
class YourOtherClass
{
IncompleteClass* member;
};
在yourotherclass.cpp中,您实际上需要包含incompleteclass.h才能使用指针。
编辑:回复您的详细信息:
如果要隐藏实现,请为其创建一个单独的(朋友)类,并引用:
class CompleteAImpl
{
friend CompleteA;
// data, members, etc. that you intend to hide
};
class CompleteA
{
CompleteAImpl* priv; // or shared_ptr if you want
};
我想你想做这样的事情。您的实现的问题是,为了引用成员结构/类,编译器需要知道该成员和前面成员的大小。您可以将(a.data_ + sizeof(all preceding members))
转换为someMember
的类型并取消引用;但这是一个丑陋且不安全的解决方案。
答案 1 :(得分:2)
我无法正确理解你的问题。
但据我所知,我只能说不完整的类型只能在您的代码中用作pointer
。
struct A; //incomplete type, since it has not been defined yet!
A *pA; //okay - pointer to an incomplete type is allowed!
A a; //error - cannot declare an automatic variable of incomplete type!
我希望这些信息可以帮助您找到解决问题的实际解决方案!
答案 2 :(得分:1)
有一个非常简单的解决方案,如果您只需要访问someMember
:提供一个私有的getter,带有一个外行定义。
class A {
private:
friend B;
int getSomeMember() const; // defined in .cpp
struct IncompleteA;
boost::shared_ptr<IncompleteA> data_;
};
class B {
public:
void SomeFct(A& a) {
a.getSomeMember();
}
};