我正在尝试设计一个可以从内部类构建的类。我试图实现这一点的方法是让一个要构建的类包含一个嵌套的构建器类。这种嵌套的类设计对我很有吸引力,因为它会自动将我的构建器类与它要构建的类相关联。
问题是,在使用g ++(8.3.0)进行编译时遇到以下编译器错误:field 'v' has incomplete type 'Vector'
。
我已经包含了一个示例,说明了我遇到的问题。当然,这个例子只是构建std::vector
的一种更为模糊的方式。但是,在我的项目中,我相信这种设计模式是合理的,因为构建器类在更换std::vector<>::push_back
方法之上做了更多的工作。
我试图寻找这个问题的解决方案,但我的所有结果都是关于内部和外部类成员之间的访问策略的问题,而不是关于实际将外部类作为成员的内部类。
#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;
}
我知道我可以将内部构建器类移动到它正在构建的类之外,但我喜欢构建器类自动限定在外部类中。
我觉得必须有一个简单的解决方案,虽然我也担心如果我设法解决这个第一个错误可能会出现某种递归问题。在定义内部类之前,也许有一些东西需要“完成”外部类的定义。
任何建议表示赞赏。
您可以将内部类的定义移到外部定义之外
class Outer
{
public:
class Inner;
};
class Outer::Inner
{
// As before
};