c ++为指针指定一个指向常量的指针

时间:2017-11-17 14:42:03

标签: c++ pointers operator-overloading

我有以下代码:

<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

我想要的是+ =运算符应该将B对象(运算符的右侧)添加到A对象的元素成员中。 所以,让我们将main修改为:

class B{
    /*
    ...
    */
};
class A{
    B** elements;
    public:
        A operator+=(const B& b){
            // this->elements[0] = &b;

        }
        A(int number){
            this->elements = new B*[number];
        }
    /*
    ...
    */
};

int main(){
    A a(10);
    return 0;
}

此后a.elements [0]应该是b对象。 我评论了一条不起作用的行,但显示了我想要的内容。取消注释它会产生以下错误:从const B *到B *的无效转换

真正的代码当然要长得多,如果你告诉我如何让+ =运算符总是将B对象分配给A.elements [0]就足够了,那么我可以根据需要编辑我的代码

由于

2 个答案:

答案 0 :(得分:3)

关注您的问题,B*不是B const*:首先,您可以调用非const的方法,而后者则不然。< / p>

并且编译器抱怨这个:你声明了一个指向可修改B的指针数组,但是你尝试在其中存储指向不可修改的B的指针。因此,如果您只是想解决此问题,您可以决定例如存储不可修改的B:

  B const** elements;
public:
 A& operator+=(const B& b) {
    this->elements[0] = &b;
    return *this;
  }

  A(int number) {
    this->elements = new B const*[number];
  }

但您的代码中存在严重问题:

  • 你正在取const B&的地址,但这个B来自哪里?它可能具有自动存储功能,并在未来的某个地方成为无效指针
  • 无法知道谁拥有指向B对象的指针,因此负责释放它。

这是C ++,你有std::unique_ptrstd::shared_ptrstd::vector,只是尝试做你在C中做的事情,甚至没有尝试使它们安全无法没有任何意义。

答案 1 :(得分:0)

您的设计存在严重问题。

    A operator+=(const B& b){
        // this->elements[0] = &b;

这里的想法是将b插入到您的集合中,但您的集合只不过是指向一些(未知长度)原始内存量的指针。您无法知道元素[x]是否存在以便存储&amp; b。就此而言,您根本不知道元素是否存在。您需要更多的簿记来存储长度。

但更糟糕的是,您传递对const B的引用并获取其地址,将该指针存储在您的集合中。如果参数是绑定到临时的引用怎么办? (Rvalues 可以绑定到const左值引用)。在这种情况下,当您将指针插入集合时,它指向的对象就会被销毁。

这假设你解决了const-wrongness,因为你引用了一个const b,取其地址,并希望它指向一个非const B.它没有。如果b真的指向一个实际的const对象(并且通过指针使用b的非const接口),那么将它抛出会导致未定义的行为。

你的成长函数会泄漏内存并丢失旧元素。是的,它是伪代码,但距离任何真实到基础的想法都太远了。

只有几行就有很多非常危险的想法。以下是建议:

  • 不存储原始指针
  • 更强烈,不存储从引用参数获得的指针
  • 简化终身管理;使用智能指针来显示谁拥有传入对象的内存
  • 保持const正确性。如果你把(智能)指针带到const对象,将它们存储为const对象的(智能)指针。
  • 当您调整分配分配的大小时,请担心旧对象和内存会发生什么。容器有助于减少这种努力。
  • 使用容器类而不是自己管理原始内存,并且许多问题都消失了(但不是参数的生命周期管理问题。)