【问题标题】:Issues with creating a constructor for square matrices [closed]为方阵创建构造函数的问题[关闭]
【发布时间】:2014-06-25 21:34:39
【问题描述】:

我正在为一个简单的大学项目创建一个方阵类。我遇到了构造函数(不是默认构造函数)的问题。因为我只需要方阵,所以我这样写

      sqmatrix(int R): rank(R)
  {
            std::vector < std::vector <double> > MATRIX; 
             MATRIX.resize(rank);           
  }

可能有也可能没有其他问题(我是初学者),但我想要回答的最重要的问题是:假设我创建了一个 sqmatrix A;在 main() 中,我该如何填写?我不确定如何访问向量向量内的数据(和写入)。

即使我不使用向量而是创建一个指针数组...当唯一的成员是 R 时如何填充它们?

感谢您的帮助!

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。
  • 如果那是一个构造函数,为什么你的类名没有大写?一旦方法存在,构造函数 (MATRIX) 中静态分配的所有内容都将被删除。你没有。你只分配空间。
  • 老实说,我认为您应该从一些入门级 c++ 教程开始,该教程侧重于其面向对象的性质。对于初学者来说,您似乎缺乏最基本的概念,您不了解基本的 c++ 类型,以非常奇特的编码风格结束......所有大写和类都较低的命名变量非常罕见。我担心的是,您可能无法以您目前的知识理解答案。
  • @Alexandru 这是一个奇怪的规则,类名必须大写。似乎 C++ 标准委员会没有收到那份备忘录。
  • @Alexandru 那么,C++ 标准库是什么?不常见还是不标准?或者它可能是不是OOP?另外,起初我没有读过你第一条评论的第一句话。不过既然有了,剩下的比第一句话还要荒唐!

标签: c++ class matrix constructor


【解决方案1】:

MATRIX.resize(rank); 将导致 MATRIX 包含 rank 数量的 std::vector&lt;double&gt;s,但这些向量中的每一个都是空的。改用这个:

sqmatrix(int R): rank(R)
{
    std::vector<std::vector<double>> MATRIX; 
    MATRIX.resize(rank, std::vector<double>(rank));           
}

但是您的代码似乎很奇怪。您正在构造函数中创建一个名为 MATRIX 的局部变量。它不应该是sqmatrix 类的数据成员吗?如果是,那么你应该使用构造函数初始化列表来初始化它

sqmatrix(int R)
: rank(R)
, MATRIX(R, std::vector<double>(R))
{
}

要访问矩阵的元素,请使用std::vector::operator[]

double elem = MATRIX[r][c];

【讨论】:

    【解决方案2】:

    您当前的代码创建了一个局部变量MATRIX,无法在此函数之外访问此变量。也许你想创建一个类变量:

    public:
        std::vector < std::vector <double> > MATRIX;
    

    现在你可以在课堂外访问它了。

    你可以这样填写:

    for(int i = 0; i < classinstance.MATRIX.size(); ++i)
        for(int p = 0; p < classinstance.MATRIX[i].size(); ++p)
            classinstance.MATRIX[i][p] = /* data */;
    

    您还可以使用std::fill 等算法来填充您的矩阵。

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多