【发布时间】:2019-04-29 18:01:49
【问题描述】:
我正在尝试设计一个可以从内部类构建的类。我试图实现这一点的方法是让一个要构建的类包含一个嵌套的构建器类。这种嵌套类设计对我很有吸引力,因为它会自动将我的构建器类与其要构建的类关联起来。
问题是,使用 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 Vector : public std::vector<int>你不应该从 C++ 标准容器类继承。 -
我的眼睛无法区分上V和下V
-
@πάνταῥεῖ 感谢您通知我,我不知道这一点。我查找了为什么这可能不好,并决定在我的项目中不这样做,而是在这种情况下使用组合。
-
@Amadeus 抱歉!我试图在示例中保持简单,在我的项目中,我的外部类被更恰当地命名,并且不代表整数向量,而是项目中某个其他类的向量。
-
@Pavis11 在我的屏幕上,在代码格式下,上 V 与下 v 相差 1 个像素。一种很难区分的
标签: c++