传递'const'指针指向c ++

时间:2016-06-08 12:35:43

标签: c++ oop pointers

以下代码无法在'func(& pobj);'行上编译两个错误声明“无法在函数main()中将'X * *'转换为'const X * *'”和“函数main()中的参数1中的类型不匹配(想要'const X * *',得到'X * *') “即使它是传递指针参数的正确方法。而且还评论了这条特殊的线,即'func(& pobj);'并取消注释它上面的两行,它声明了一个新的'const'指针'pp'所需类型(在func的参数中),但仍然在声明并指定'pp'的行上抛出一个错误,说“无法转换'X * *函数main()中的'to'const X * *'。

using X = int;

void func(const X **);

int main() {
    X *pobj = new X(58);

    // const X **pp = &pobj;  // ERROR
    // func(pp);

    func(&pobj); // ERROR
}

我相信这是将常量指针作为参数传递的正确方法,我只是不明白为什么程序无法编译。任何人都可以指出上面代码中的错误,如果我错了,建议我正确的逻辑/语法?提前致谢。

更新: 这个问题被标记为重复,但它没有解决手头问题的答案。因此,如果Stack Overflow社区帮助我解决我的问题,我会很高兴。谢谢。

3 个答案:

答案 0 :(得分:2)

这样做:

const X * pobj = new X(58);
// ^^^^^^

func(&pobj);

现在pobj是一个指向const的指针 - X,其地址的类型为const X **

如果要保留原始(可变)指针,则需要先创建一个新的const指针:

X * p = new X(58);
const X * q = p;

func(&q);

答案 1 :(得分:2)

您需要将const应用于指向指针:

void func(X *const *);

...
     X * const *pp=&pobj; // ERROR    
     func(&pobj); // ERROR
...

void func(X * const * obj) { // module code goes here
}

答案 2 :(得分:0)

如果Ajay的答案不合适,因为你无法改变func()的界面,

如果Kerrek的答案不起作用,因为func()更改指针,必须将其分配回来,这不会发生:

X * p = new X(58);
const X * q = p;
func(&q);
p = q;   // errror

然后简单地使用一个演员:

func(const_cast<const X**>(&p))