【问题标题】:Passing 'const' pointer which points to another pointer in c++传递指向C++中另一个指针的'const'指针
【发布时间】:2016-06-09 21:18:37
【问题描述】:

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

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 社区能帮助我在这里解决我的问题,我会很高兴的。谢谢。

【问题讨论】:

    标签: c++ oop pointers


    【解决方案1】:

    这样做:

    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);
    

    【讨论】:

    • 这解决了模块调用的问题,但这不允许我们更改指针'pobj'指向的值,这对我的程序至关重要(这只是其中的一小部分错误)。您有解决此问题/错误的想法吗?感谢您的回复。
    • @hecate:听起来你当时没有正确定义你的模块 API。如果要修改事物,则需要获取指向可修改事物的指针。也许检查另一个答案。
    • 请注意,您在原始指针中保留的第二种解决方案不起作用.. :-(
    • @hecate:真的吗? Works perfectly 为我...
    【解决方案2】:

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

    void func(X *const *);
    
    ...
         X * const *pp=&pobj; // ERROR    
         func(&pobj); // ERROR
    ...
    
    void func(X * const * obj) { // module code goes here
    }
    

    【讨论】:

    • 嘿,感谢真正解决问题的人。但是您介意向我解释将“const”放在两个星号 (*) 之间的理论/含义/逻辑,因为这不是通常的做法吗?你能告诉我为什么只使用'func(&pobj);'调用函数时程序会失败吗?没有声明指针'pp'?再次感谢朋友。 :-)
    • 简而言之:const X* 实际上是X const* - 使指针类型为const(而不是X)。 const X**X const* *,而不是 X * const*。 . X* const * 可以指向const X*,您可以将X* obj 设置为X const* obj 以实现这一点。查看“重复”链接以了解更多信息
    【解决方案3】:

    如果Ajay的回答不合适,因为你不能改变func()的接口,

    如果 Kerrek 的回答不起作用,因为 func() 改变了必须重新分配的指针,这不会发生:

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

    然后只需使用演员表:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多