c++ - 访问 C++ 类成员对象,但不允许覆盖它

标签 c++ class pointers vector smart-pointers

我正在学习 C++,但遇到了一个小问题。我有一个包含 vector<int> 的类.从这外面vector<int>应该是可访问的,所以应该可以添加/删除/获取它的元素。

应该不可能用新实例覆盖对象。 这是一个这样的示例类(已最小化):

class MyClass
{
    public:
        vector<int>& vec() { return _vec; }
    private:
        vector<int> _vec;
};

例如以下代码有效:

MyClass x;
x.vec().push_back(0);
x.vec().push_back(7);
x.vec().push_back(9);
cout << c.vec().size() << endl;

但不幸的是,下面的代码也可以工作:

MyClass x;
x.vec() = vector<int>();

我想禁止这样做,但我确实只找到了返回类型指针的解决方案 vector<int> * .但我了解到指针是“邪恶的”,我不应该直接使用它们,我必须使用智能指针。我认为对于这个问题智能指针是没用的,所以我不知道如何解决这个简单的问题:-/

或者只是一个简单的指针是最干净的解决方案吗?

最好的问候

凯文

-编辑-

一般来说,我喜欢制作一些可以像下面的 C# 类一样使用的东西:

public class MyClass
{
    public List<int> List { get; private set; }

    public MyClass()
    {
        List = new List<int>();
    }
}

这只是一个示例,我只是在考虑如何用 C++ 实现它。也许在某些情况下我有比 vector<int> 复杂得多的类/List<int>包含到其他类中。

但也许只能通过为内部对象定义自己的方法(=接口(interface))来做到这一点。

最佳答案

在我看来,唯一可接受的解决方案是为 vector 类中可能的所有方法提供转发函数,这似乎是错误的。所以我想提出一个替代答案。

创建一个公开派生自 vector 的小型模板类,通过将其设为私有(private)来隐藏 operator= 方法。

template<class T>
class immutablevector : public vector<T>
{
  private:
    immutablevector &operator=(vector<T>);
};

然后在 MyClass 中,凡是您要使用 vector 的地方,请改用 immutablevector

class MyClass
{
  public:
    immutablevector<int>& vec() { return _vec; }
  private:
    immutablevector<int> _vec;
};

现在您可以通过 vec 方法安全地访问所有 vector 功能,但您将无法分配新的 vector 实例。

关于c++ - 访问 C++ 类成员对象,但不允许覆盖它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16353232/

相关文章:

c++ - ptrdiff_t 的无符号拷贝是什么?

c++ - 循环中的条件评估?

jquery - 如何在 jQuery 中删除除一个元素之外的所有元素?

对二维结构体的指针感到困惑

arrays - 为什么数组大小未知?

java - 如何索引大量的 txt 文件? (Java/C/C++)

c++ - 如何控制 Batch Build → Build All 的顺序

c - 在 C 中读取两列文件

c++ - C++ 中的意外破坏

Java 从另一个类调用数组