gpt4 book ai didi

c++ - C++ 和 operator[] 中的自定义 Vector 和 Matrix 类

转载 作者:行者123 更新时间:2023-11-30 00:57:56 26 4
gpt4 key购买 nike

我在 C++ 中有一个依赖原始指针的 vector 类。我不使用 std::vector 因为我需要为特殊情况从原始指针创建 vector 对象。这是我的类(class)的一个非常简单的例子:

template <typename T>
class Vector
{ ...
private:
T * m_data; int m_size; bool dontFree; ...
public:
Vector(T *const ptr, int size) { m_data = ptr; m_size = size; dontFree = true; }
Vector(int size, T val) { ... dontFree = false; }
~Vector(): { if(!dontFree) delete [] m_data; }
T& operator[](const size_type index);
};

同样,我有矩阵数据类型,它也将数据存储在原始指针中,并且可以使用 vector 来支持 [][],因为它在 C++ 中是不允许的,例如:

template<typename T>
class Matrix
{
private:
T * m_data; ...

public:
...
Vector<T>& operator[](const int rowIndex)
{
return Vector<T>(&m_data[rowSize * rowIndex], rowSize);
}
}

我怎样才能有效地实现 operator[] 来返回一个 Vector 矩阵,以便我可以编写代码,如下所示:

Matrix<int> m(5,5);
m[1][1] = 10;
int temp = m[1][2];

请建议考虑复制构造函数等开销

最佳答案

创建一个重载 operator[] 的代理类,您可以授予对矩阵数组的访问权限。像这样:

template<typename T>
class Proxy
{
public:
Proxy(T * tp)
:rowStart(tp)
{}

T & operator[](const int columnIndex)
{
return rowStart[columnIndex];
}

private:
T * rowStart;
};

然后您的 Matrix 类的 operator[] 可以返回其中之一,如下所示:

Proxy<T> operator[](const int rowIndex)
{
return Proxy<T>(m_data + rowSize * rowIndex);
}

当然它并不完整,但它应该可以帮助您入门。

关于c++ - C++ 和 operator[] 中的自定义 Vector 和 Matrix 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com