C++ 将构造函数更新传播到客户端代码库

问题描述 投票:0回答:1

所以我正在尝试向遗留代码库添加新功能。并且希望对客户端代码的影响最小。

我有一个带有默认构造函数和一些非默认构造函数的类。

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++ 技巧/模式可以帮助我将此更改无缝地传播到客户端代码(或以最小的更改) 我正在尝试寻找解决方案,但想不出任何解决方案。 任何指示将不胜感激。

c++ constructor c++17
1个回答
0
投票

您可以将

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 数组。

© www.soinside.com 2019 - 2024. All rights reserved.