我正在尝试设计一个可以从内部类构建的类。我试图实现此目的的方法是使要构建的类包含嵌套的生成器类。这种嵌套类设计对我很有吸引力,因为它会自动将我的构建器类与要构建的类相关联。
问题是,使用g ++(8.3.0)进行编译时出现以下编译器错误:field 'v' has incomplete type 'Vector'
。
我提供了一个示例,说明了我遇到的问题。当然,此示例只是构建std::vector
的一种比较晦涩的方式。但是,在我的项目中,我认为这种设计模式是合理的,因为在仅替换std::vector<>::push_back
方法的基础上,builder类正在做更多的工作。
我曾尝试寻找该问题的解决方案,但是我所有的结果都是关于内部和外部类成员之间的访问策略的问题,而不是关于实际上将外部类作为成员的内部类的问题。
#include <vector>
class Vector : public std::vector<int> {
public:
class Builder {
public:
Builder &add(int const i) {
v.push_back(i);
return *this;
}
Vector build() const {
return v;
}
private:
Vector v;
};
};
int main() {
Vector v = Vector::Builder().add(1).add(2).add(3).build();
return 0;
}
我知道我可以将内部构建器类移出它正在构建的类之外,但是我喜欢将构建器类自动限制在外部类内部。
我觉得必须有一个简单的解决方案,尽管我也担心如果设法解决第一个错误,可能会有某种递归问题。在定义内部类之前,也许有某种方式可以“完成”外部类的定义。
任何建议都值得赞赏。
答案 0 :(得分:5)
您可以将内部类的定义移到外部定义之外
class Outer
{
public:
class Inner;
};
class Outer::Inner
{
// As before
};