【问题标题】:Initialize a 2x2 matrix in a class default constructor在类默认构造函数中初始化一个 2x2 矩阵
【发布时间】:2013-02-27 16:52:46
【问题描述】:

我正在尝试在 C++ 中创建一个 2x2 矩阵类,并希望通过默认构造函数将矩阵初始化为单位矩阵。我的课是:

class Matrix2x2
{
public:
    Matrix2x2();
    void setVal(int row, int col, double newVal);

private:
    double n[2][2];
};

void Matrix2x2::setVal(int row, int col, double newVal)
{
n[row][col] = newVal;
}

我尝试了几个不同的构造函数,但没有一个能达到我想要的效果。

Matrix2x2::Matrix2x2(): setVal(0,0,1), setVal(0,1,0), setVal(1,0,0), setVal(1,1,1)
{  }  

 Matrix2x2::Matrix2x2(): n[0][0](1), n[0][1](0), n[1][0](0), n[1][1](1)
{  }  

我意识到这可能只是某个地方的一个简单错误,但我似乎找不到它,有什么想法吗?

【问题讨论】:

  • 您有什么理由不使用真正的 LA 库,例如 Boost uBlas 或 NT2?
  • 为什么会出现这种疯狂的语法?为什么不让它成为具有默认值的普通构造函数?

标签: c++ class matrix default-constructor


【解决方案1】:

您可以使用数组聚合:

class Matrix2x2 {
public:
    Matrix2x2() : n({{3,1},{4,7}}) {
    }
    void setVal(int row, int col, double newVal);
private:
    double n[2][2];
};

Demo on ideone.

【讨论】:

  • 谢谢,但我得到:错误:仅允许在第一个 '{' 处将 '()' 作为数组成员 "Matrix2x2::n" 的初始值设定项。和错误:预期一个';'在第二个“,”和第三个“}”。
  • @Jon 你用什么编译器?
  • MS Visual C++ 2010 Express。我必须在构造函数主体中编写初始化才能使其正常工作。
【解决方案2】:

在 C++11 中:

Matrix2x2::Matrix2x2(): n{{1,0},{0,1}} {}

从历史上看,您无法在初始化列表中初始化数组,因此如果您停留在过去,则必须在构造函数主体中分配值:

Matrix2x2::Matrix2x2()
{
    n[0][0] = 1;  // or setVal(0,0,1) if you prefer
    n[0][1] = 0;
    n[1][0] = 0;
    n[1][1] = 1;
}

【讨论】:

  • 唯一的“工作”是第二种选择。但是,这在编译时给了我另一个错误: 1>main.obj : error LNK2005: "public: __thiscall Matrix2x2::Matrix2x2(void)" (??0Matrix2x2@@QAE@XZ) 已经在functions.obj 1>d中定义:\documents\visual studio 2010\Projects\Ov05\Debug\Ov05.exe:致命错误 LNK1169:找到一个或多个多重定义符号
  • @Jon:这听起来像是在标题中定义构造函数。要么将定义移动到单个源文件中,要么将inline 添加到标题中的定义中,或者将定义移动到类定义中。
  • 你完全正确!谢谢你。将定义移到我的 functions.cpp 文件中,一切都开始工作了。 ;)
【解决方案3】:

我正在尝试在 C++ 中创建一个 2x2 矩阵类,并希望通过默认构造函数将矩阵初始化为单位矩阵。

//constructor (inside class)
Matrix2x2()
{
    n[0][0] = 1.0;
    n[1][1] = 1.0;
    n[0][1] = 0;
    n[1][0] = 0;

}

【讨论】:

    【解决方案4】:

    或者像这样

    Matrix2x2::Matrix2x2()
    {  
        setVal(0,0,1);
        setVal(0,1,1);
        setVal(1,0,1);
        setVal(1,1,1);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2011-08-09
      相关资源
      最近更新 更多