C++ Primer 421页 我们不能将 StrBlobPtr 绑定到一个 const StrBlob 对象。这个限制是由于构造函数接受一个非 const StrBlob 对象的引用而导致的

你提到的是StrBlobPtr这个类,它通常被设计为与StrBlob类一起工作,用于提供对StrBlob对象中存储的字符串的引用。如果StrBlobPtr的构造函数接受一个非constStrBlob引用,那么它确实不能用于指向一个constStrBlob对象,因为这将违反const正确性。

在C++中,const对象不能被修改,因此如果你有一个const StrBlob对象,你期望的是任何指向它的指针或引用都不应该能够修改这个对象。但是,如果StrBlobPtr的构造函数接受一个非constStrBlob&,那么它内部可能会修改传入的StrBlob对象,这与const对象的性质相冲突。

要解决这个问题,你可以为StrBlobPtr提供一个额外的构造函数,该构造函数接受一个const StrBlob&。这个构造函数可以创建一个只能读取的StrBlobPtr,它不能修改StrBlob对象。然而,你还需要确保StrBlobPtr的其他成员函数和方法也遵守这个const约定。

例如:

class StrBlobPtr {
public:
    // 构造函数接受非const引用
    StrBlobPtr(StrBlob& sb) : wptr(sb.data), curr(0) {}

    // 额外的构造函数接受const引用
    StrBlobPtr(const StrBlob& sb) : wptr(sb.data), curr(0) {}

    // ... 其他成员函数和方法 ...

    // 确保没有成员函数会修改StrBlob对象(对于const版本的构造函数)

private:
    std::weak_ptr<std::vector<std::string>> wptr; // 假设使用weak_ptr来避免循环引用
    std::size_t curr; // 当前指向的元素的索引

    // ... 可能还有其他私有成员 ...
};

// 注意:在实际实现中,你可能需要为const和非const版本的StrBlobPtr提供不同的接口或行为

但是,请注意,上述的const构造函数可能并不完全满足const正确性的要求,因为它仍然持有一个到非conststd::vector<std::string>weak_ptr。如果StrBlobPtr的成员函数试图修改这个vector,那么即使StrBlob对象是const的,这也将是未定义的行为。因此,你可能需要为const版本的StrBlobPtr提供更严格的限制,以确保它不会违反const约定。

在实际应用中,你可能还需要考虑其他因素,比如线程安全、异常安全性等。

转载自 百度 文言一心

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值