我应该如何为指针成员指定构造函数参数的常量

时间:2016-11-04 19:05:01

标签: c++ constructor const

基本上我想要一个包装指针的简单类(即有一个指针成员),我不知道如何指定构造函数参数的常量。如果我这样做

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,但是我可以构造一个与对象相关的对象?

3 个答案:

答案 0 :(得分:0)

你的构造函数应该带一个指向常量对象的指针:

A(const int *d) : data(d) {}

答案 1 :(得分:0)

你有一个关键的误解:编译器警告你,你正在将指向const int的指针传递给一个可能试图改变int值的对象。声明const A无法解决该问题,因为虽然data无法更改,data指向的内容仍然可以。

您需要的解决方案已由其他人在评论中提供:

  1. 如果A不需要修改*data,那么您应该将其成员变量声明为const int *data
  2. 否则,您需要提供两个版本:Aconst_A。您可以输入两个单独的定义或使用模板,因此您只需输入一次。
  3. 如果您知道您的使用是安全的并且您想要危险地生活,那么您可以使用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 }