【发布时间】:2015-11-19 11:13:13
【问题描述】:
并非一个类型的所有实例都可以复制到具有= 符号的同一类型的另一个实例。
例如, 虽然它可能适用于 ints:
int x = 0;
int y = 5;
x = y; //x is now: 5
它不适用于 char 数组:
char x[32]="data to overwrite";
char y[32]="new data";
x = y; //incorrect
或其他数组:
int x[5] = {1,2,3,4,5};
int y[5] = {6,7,8,9,10};
x = y; //incorrect
或char*s:
char* x="data to overwrite";
char* y="new data";
x = y; //incorrect
如何编写一个允许我执行以下操作的重载函数?
int x = 0;
int y = 5;
Copy(x,y); //x is now: 5
char x[32]="data to overwrite";
char y[32]="new data";
Copy(x,y); //x is now: "new data"
int x[5] = {1,2,3,4,5};
int y[5] = {6,7,8,9,10};
Copy(x,y); //x is now: {6,7,8,9,10}
char* x="data to overwrite";
char* y="new data";
Copy(x,y); //x is now: "new data"
*我假设任何抽象数据类型都在它们的重载赋值运算符(或编译器提供的浅拷贝)中完成了必要的工作
为什么需要这样做?
为了更容易测试遗留 C 代码库的部分,我想围绕一些组件生成一些 C++ 包装器。由于 C 代码的奇怪设计,我想摆脱很多间接性。因此,使用简单的 Copy 函数将变量复制到另一个实例中会容易得多,而不是解析类型,然后决定如何将适当的副本复制到另一个实例变量中。
【问题讨论】:
-
....不要?使用
std::string和std::vector然后你可以做x = y... -
为什么您认为指针分配 (
char*) 会不正确?这工作得很好。想要解决什么问题? -
@Ben 我正在与旧版 C 代码交互。
-
无需提供新功能,使用
std::copy。 IIRC 你不能在不使用包装类的情况下重载全局赋值运算符。另外,我建议使用std::array而不是原始的 c 样式数组。 -
@TrevorHickey 接口,未使用。您可以在需要时使用
string.c_str()和vector.data()进行更改。
标签: c++ function overloading copying