所以我正在尝试向遗留代码库添加新功能。并且希望对客户端代码的影响最小。
我有一个带有默认构造函数和一些非默认构造函数的类。
struct A {
A() {}
A(int x) {}
std::array<int, 4> data;
};
以前,A 类有一个固定大小的静态数组作为成员。现在,有了新的需求,数组的大小不再是固定的,必须是动态数组。尺寸的信息存储在 B 类中。
现在,根据新的要求,我向类
A
的所有构造函数添加了必需的参数。A
现在如下所示:
struct A {
A(B *b) { size = b->getSize(); data = new int[size];}
A(B *b, int x) { size = b->getSize(); data = new int[size]; }
int *data;
};
问题是,在当前的客户端代码中,类
A
在多个地方被实例化。 (可能> 10,000 个实例)并且更新所有位置是不可行的。
是否有任何 C++ 技巧/模式可以帮助我将此更改无缝地传播到客户端代码(或以最小的更改) 我正在尝试寻找解决方案,但想不出任何解决方案。 任何指示将不胜感激。
您可以将
b
更改为构造函数的最后一个参数,并为其指定默认值 nullptr
。b
是 nullptr
,则使用之前使用的固定大小。
这样客户端就可以逐步升级到增强版API,而不需要一次性全部更改代码。
static constexpr size_t DEFAULT_SIZE = 4; // Use the previous fixed size
struct A {
A(B *b = nullptr) { size = b ? b->getSize() : DEFAULT_SIZE; data = new int[size]; }
A(int x, B *b = nullptr) { size = b ? b->getSize() : DEFAULT_SIZE; data = new int[size]; }
// ...
int * data;
size_t size;
};
std::vector
,而不是使用原始 C 数组。