如何在 C++ 中为矩阵类型构建构造函数

Posted

技术标签:

【中文标题】如何在 C++ 中为矩阵类型构建构造函数【英文标题】:How to build a constructor for a matrix type in C++ 【发布时间】:2015-12-02 06:40:00 【问题描述】:

我是 C++ 的初学者,作为学习练习,我正在尝试编写一个用于执行矩阵数学(矩阵乘法、求逆等)的库。 我要做的第一件事是定义一个类“Matrix”,它的成员是“rows”——矩阵中的行数,“cols”——矩阵中的列数,以及“_matrix”——一个数组包含矩阵的元素。 问题是我不知道如何构建构造函数。 我可以写类似“矩阵(m,n,array)”的东西吗?如何确保数组实际上包含 m*n 元素? 我会喜欢一些关于如何进行的指导(好吧..如果我说实话,如何开始:))

谢谢!

【问题讨论】:

默认情况下你的类应该自己管理数组,而不是让用户传入任何数组。完成该工作后,您可以添加一个构造函数以从外部数组复制,但是您必须确保用户传入有效的维度,如果用户做得不好,那是用户的错,而不是您的错。 我强烈建议您在互联网上搜索示例。你可以做一些类似“c++ 矩阵源”的事情。 欢迎堆栈溢出!不幸的是,这个问题可能不是最适合堆栈溢出的问题。最好的问题是围绕一个非常具体的编程问题组织的,它可能有一些代码,这些代码是否有效。 “如何开始的指南”不是 *** 提供的——如何开始在很大程度上是一个见仁见智的问题,这些问题往往会被否决。最好在您深入了解它并且您有一些代码要显示时回来。 顺便说一下,矩阵是一个单独的对象而不是数组;就像堆栈不是数组(但可以使用一个来实现)。我建议调整你的问题的标题(类似于“实现矩阵构造函数”)。 【参考方案1】:

另一个答案提供了一个典型的解决方案,人们期望Matrix 类构造函数具有(即Matrix(unsigned, unsigned))。

如果您将其作为一个练习,并且您对学习 C++ 很认真,我会建议实现以下构造函数:

Matrix(std::initializer_list<std::initializer_list<T>> init_list);

因此你可以像这样构建你的对象:

Matrix m(1,2,3,4,5,6,7,8,9);

请注意,您可以直接从提供的std::initializer_lists 中获取构造矩阵的大小,并且可以通过这种方式轻松构建模板化矩阵。

【讨论】:

谢谢!这正是我一直在寻找的。我不熟悉您建议的第二个构造函数的语法,但我会查一下。【参考方案2】:

如果我使用的是矩阵,我希望有这样的构造函数:

Matrix(unsigned int maximum_rows, unsigned int maximum_columns);

我不关心矩阵是用数组、列表还是其他数据结构实现的。我告诉它大小,所以构造一个。

编辑 1: 您想要隐藏用户的 Matrix 实现。构造函数的实现取决于您的实现。

下三角矩阵的实现可能与通用矩阵不同。您可以选择vectorvectors、二维数组、一维数组或链表。

我作为用户并不真正关心它是如何实现的。我只关心预期的 Matrix 功能是否正确实现,并且在某些情况下是有效的。所以我可能会期待一个重载的operator +add 方法或两者兼而有之。

再次,搜索互联网以查看其他人如何实现矩阵的示例。

编辑 2: 在某些情况下,您希望有一个用于功能的类和另一个用于实现的类。在这种情况下,您可能希望将实现传递给 Matrix 的构造函数。 (我建议使用对描述实现接口的基类的引用)。但这对于您需要的东西可能有点过分了。

【讨论】:

以上是关于如何在 C++ 中为矩阵类型构建构造函数的主要内容,如果未能解决你的问题,请参考以下文章

来自基类的 c++ 构造函数

在 C++ 中为具有包含指针的集合的类编写复制构造函数

c++拷贝构造函数

C++的默认构造函数与构造函数

C++ 简化构造函数重载

如何在 swig & python 中为没有默认构造函数的 std::pair<> 创建接口?