基本上我想要一个包装指针的简单类(即有一个指针成员),我不知道如何指定构造函数参数的常量。如果我这样做
class A {
public:
A(int *d) : data(d) {}
private:
int *data;
};
然后我不能这样做
void func(const int *param) {
const A aInstance(param);
}
因为构造函数没有采用const指针。
我希望能够构造const对象并使用const指针来完成它,但我也希望能够构造修改指针的非const对象。如何指定此类以便在相关时修改*data
,但是我可以构造一个与对象相关的对象?
答案 0 :(得分:0)
你的构造函数应该带一个指向常量对象的指针:
A(const int *d) : data(d) {}
答案 1 :(得分:0)
你有一个关键的误解:编译器警告你,你正在将指向const int
的指针传递给一个可能试图改变int
值的对象。声明const A
无法解决该问题,因为虽然data
无法更改,data
指向的内容仍然可以。
您需要的解决方案已由其他人在评论中提供:
A
不需要修改*data
,那么您应该将其成员变量声明为const int *data
。A
和const_A
。您可以输入两个单独的定义或使用模板,因此您只需输入一次。const_cast
删除常量并阻止编译器的警告。答案 2 :(得分:0)
似乎令人满意的唯一答案可能是回答这个问题的是来自@JohnAuld的评论,他建议我模拟这个课程
template< typename data_t >
class A
{
public:
A(data_t *data) : d(data) {}
private:
data_t *d;
};
理论上,这可以很好地构造一个const
能够对象,它甚至可以让我创建const和非const方法,如果我尝试为{指向的数据赋值{1}}用于const对象。这一切都很好,花花公子。它甚至让我按照自己的意愿行事:
d
然而,失败的地方是在类上使用const说明符。如果我想将后续const对象传递给另一个函数,它将失败:
void doSomething(const int *somePointer) {
A<const int> a(somePointer);
}
基本上void doSomethingToAnA(const A<int> &a);
void doSomethingToIntPointer(const int *aPointer) {
const A<int> aInstance(aPointer);
doSomethingToAnA(aInstance);//womp womp
}