【问题标题】:Double declaration and initialization of vector in a class, C++?类中向量的双重声明和初始化,C++?
【发布时间】:2022-01-10 10:18:03
【问题描述】:

亲爱的晚安

我有一个问题,看起来我正在使用类,并且在许多情况下我使用向量的向量(2D 向量),我的代码运行得很好。但是,我有点困惑,查看我的头文件,我在受保护的变量中声明了一个向量向量,然后在我的 cpp 文件的构造函数部分中,我再次声明了向量向量,但这次给出了所需的大小并具有所有元素中的“0”。但是,当我尝试在我的成员函数中使用这个向量向量时,如果我使用 .size() 输出是“0”并且我期待 3,似乎没有定义维度而不是“0”值。

但是,当我再次在成员中声明向量的向量(参见 cpp 文件中的注释行)函数时,代码给出了 3 和由“0”组成的 3 X 3 的完整矩阵。

这是为什么呢?使用构造函数基本上是给变量的值。

查看下一个代码,cpp 文件上的注释行是我再次声明向量的位置。

头文件是:

#pragma once
#include <iostream>
#include <vector>

class Matrix
{
private:
    const int m_nRows;
    const int m_nCols;
protected:
    std::vector <std::vector <double>> MATRIX;

public:
    Matrix(int rows, int cols);
    ~Matrix();
    void getMatrix();
};

cpp文件是:

#include "Matrix.h"

Matrix::Matrix(int rows, int cols)
    : m_nRows(rows),
    m_nCols(cols)
{
    std::vector <std::vector <double>> MATRIX(m_nRows, std::vector<double>(m_nCols, 0));
}

Matrix::~Matrix()
{
}

void Matrix::getMatrix()
{
    //std::vector <std::vector <double>> MATRIX(m_nRows, std::vector<double>(m_nCols, 0));
    std::cout << MATRIX.size() << std::endl;
    for (auto& columns : MATRIX)
    {
        for (auto& element : columns)
        {
            std::cout << element << " ";
        }
        std::cout << "\n";
    }

}

主文件是:

#include <iostream>
#include <vector>
#include "Matrix.h"

    int main() {
        int rows = 3;
        int cols = 3;
    
        Matrix SmallMatrix(rows, cols);
        SmallMatrix.getMatrix();
    
        system("pause>0");
    }

【问题讨论】:

  • 查找术语“范围”的含义。注释行声明了一个名为 MATRIX 的变量,它 (1) 是函数 Matrix::getMatrix() 的局部变量 (2) 与名为 MATRIXMatrix 的成员完全不同的对象和 (3) 当函数不再存在时返回给调用者。顺便说一句,你的构造函数做同样的事情 - 它创建一个名为 MATRIX 的变量,它是构造函数主体的本地变量,因此构造函数实际上根本不会影响名为 MATRIX 的成员。
  • 谢谢你的回答,我明白了。

标签: c++ class vector


【解决方案1】:

您在构造函数中声明了另一个名为 MATRIX 的变量。您必须改为在类中声明的 MATRIX 成员上使用 resize()。那个MATRIX的初始化可以是这样的:

MATRIX.resize(m_nRows);
for (int i =0; i<m_nRows; i++){
   MATRIX[i].resize(m_nCols, 0);
}

【讨论】:

    【解决方案2】:

    在你的构造函数中:

    Matrix::Matrix(int rows, int cols)
        : m_nRows(rows),
        m_nCols(cols)
    {
        std::vector <std::vector <double>> MATRIX(m_nRows, std::vector<double>(m_nCols, 0));
    }
    

    您定义了一个名为MATRIX 的全新变量,它与成员变量Matrix::MATRIX 完全不同。

    要初始化Matrix::MATRIX 成员变量,您应该在成员初始化器列表中进行,就像m_nRowsm_nCols 变量一样:

    Matrix::Matrix(int rows, int cols)
        : m_nRows(rows),
        m_nCols(cols),
        MATRIX(m_nRows, std::vector<double>(m_nCols, 0))
    {
    }
    

    【讨论】:

    • 感谢您的回答,现在一切正常。只是为了好奇当你有一个像这样的向量(011100)时会发生什么,我想生成一个大小为 3 X 3 的向量向量,因为前一个向量只有 3 个元素有 1。然后如果我想初始化我初始化器列表中的向量向量是不可能的,对吧?因为我必须首先传递 0 和 1 的向量。然后执行一个 for 循环,计算我有多少个 1。然后根据计数器,我可以初始化我的向量向量吗?或者我怎么能在初始化列表中做到这一点?
    • @baezacaljo 如果您想要特定的值,那么您可以使用初始化列表来初始化向量并设置它们的大小,如我上面的答案所示。然后在构造函数体中使用函数和循环来设置元素的值。
    • 非常感谢我明白了,现在是时候阅读有关构造函数的更多信息了。非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多