【发布时间】:2026-01-16 07:20:06
【问题描述】:
如何从值参数创建指针?
尝试 1
template<typename T1, typename T2>
class Both {
public:
T1 *lx;
T2 *rx;
Both(T1 _lx, T2 _rx) {
lx = new T1;
rx = new T2;
*lx = _lx;
*rx = _rx;
}
~Both() {
delete lx;
delete rx;
}
};
class cls {
public:
int x;
cls(int v) : x(v) {}
};
Both<cls, cls> b(cls(1), cls(2));
这会导致错误
错误:'cls' 的初始化没有匹配的构造函数 lx = 新 T1;
我不想强制 Both 的所有参数必须有一个默认的空构造函数。
尝试 0
在此之前,我尝试将Both 实现为
Both(T1 _lx, T2 _rx) : lx(&_lx) rx(&_rx) {}
我收到了警告
警告:使用参数“_rx”的堆栈地址初始化指针成员“rx”[-Wdangling-field] 两者(T1 _lx, T2 _rx) : lx(&_lx), rx(&_rx) {}
尝试 2
Both(T1 _lx, T2 _rx) {
lx = (T1*) malloc (sizeof(T1));
rx = (T2*) malloc (sizeof(T2));
*lx = _lx;
*rx = _rx;
}
发出中止信号
FAILED: {Unknown expression after the reported line} 由于致命错误情况: SIGABRT - 中止(异常终止)信号
我对@987654327@ 的预期用例是让用户在完成后手动调用delete
因此重申一下,如何将从参数传递的非指针值转换为指针?
【问题讨论】:
-
当类全是指针但没有值时,为什么要按值传递?您正在存储指向构造函数参数的指针,即一旦构造函数返回,它们就是无效指针
-
为什么要手动
delete?您的代码与The Rule of Three不兼容,所以在复制Both的对象时可能会造成一些麻烦。