C++ 宏可用于访问动态数组或向量中的元素或为其赋值吗

C++ 宏可用于访问动态数组或向量中的元素或为其赋值吗,c++,C++,我已经编写了一个小代码,它隔离了我在使用宏访问std::vector中的元素或为其赋值时有缺陷的方法/理解。下面是代码片段 #define mat(i,j,nrows) mat[((j)*(nrows))+(i)] struct _STR1 { int nRows, nCols; std::vector < double >mat; std::vector < double >anothermat; }; void Create_Data (int &

我已经编写了一个小代码,它隔离了我在使用宏访问std::vector中的元素或为其赋值时有缺陷的方法/理解。下面是代码片段

#define mat(i,j,nrows) mat[((j)*(nrows))+(i)]


struct _STR1
{
 int nRows, nCols;
 std::vector < double >mat;
 std::vector < double >anothermat;
};

void Create_Data (int &nC, _STR1 * &_str)
{
 _str = new _STR1[nC];

 for (int myid = 0; myid < nC; myid++)
 {
  _str[myid].nRows = 100;
  _str[myid].nCols = 3;

  _str[myid].mat.resize (_str[myid].nRows * _str[myid].nCols);

  _str[myid].anothermat.resize (_str[myid].nRows * _str[myid].nCols);

  for (int i_row = 0; i_row < _str[myid].nRows; i_row++)
    {
      _str[myid].mat (i_row, 0, _str[myid].nRows) = 1.0e0;

      _str[myid].mat (i_row, 1, _str[myid].nRows) = 1.0e0;

      _str[myid].mat (i_row, 2, _str[myid].nRows) = 1.0e0;

      _str[myid].anothermat (i_row, 2, _str[myid].nRows) = 1.0e0;
    }
 }
}
我认为我对使用宏的理解是错误的,但我无法理解为什么会这样


有人能告诉我为什么这种方法是错误的,为什么我在一种情况下有错误,而另一种情况下没有。我对宏的使用正确吗

宏被认为是不好的做法

改用函数。它们不太容易出错(例如,类型安全)

您可以使用各种技术来获得与C宏相同的性能,例如模板函数

在您的情况下,我只需定义一个包装器类:

template <typename T>
class Mat {
  private:
    std::vecotr<T> mat;
    int nrows;
  public:
    Mat(const Matrix & mat, int nrows);
    const T& operator()(int i, int j) const {
        return mat[j * nrows + i];
    }
    T& operator()(int i, int j) {
        return mat[j * nrows + i];
    }
};
模板
班垫{
私人:
标准:维科特材料;
int nrows;
公众:
Mat(常数矩阵和Mat,int nrows);
常量T&运算符()(int i,int j)常量{
返回垫[j*nrows+i];
}
T运算符()(int i,int j){
返回垫[j*nrows+i];
}
};

虽然您的方法是非传统的,但在第一个矩阵的情况下,它在技术上并没有错误。在第二个矩阵的情况下,你根本就没有为它编写宏,所以<代码> ANOTMAT(IyROW,2,YSTR[MyID] .NROX)< /C>不转换为任何东西,并且因为它本身不是有效的C++,所以不能构建你的程序。
schorsch312的回答显示了一种更好的方法(尽管有拼写错误);碰巧,我昨天才写过。

与您的问题无关,但名称以前导下划线开头,后跟大写字母(例如
\u STR1
)是为“实现”(编译器和标准库)保留的。不要在自己的代码中使用此类名称。请参见,例如,您没有使用宏。你确定那是唯一一条出错的线吗?那上面的线呢?至于你的错误,
\u str[myid]。anothermat
是一个向量。它没有函数调用操作符。你到底想在那里做什么?那条线的目的是什么?与使用向量
mat
的行相同?哦,对不起@Someprogrammerdude。我现在已经添加了宏,为了解决您的问题,请不要使用宏!创建一个简单的(可能是模板化的)函数,它可以满足您的需要。您的伪代码有点太伪了。尽管这个想法是正确的。另外,
getMat
可以是
operator()
,因此OP不需要太多更改代码。谢谢。当我发现这个错误后,我想到了这个想法。我不是编程专家,所以我犯了这些错误!非常感谢您更正了模板放置并添加了运算符重载。很抱歉,您的矩阵位置计算也不正确。按照惯例,矩阵记录的是列的数量,而不是行的数量。
template <typename T>
class Mat {
  private:
    std::vecotr<T> mat;
    int nrows;
  public:
    Mat(const Matrix & mat, int nrows);
    const T& operator()(int i, int j) const {
        return mat[j * nrows + i];
    }
    T& operator()(int i, int j) {
        return mat[j * nrows + i];
    }
};