C++ 宏可用于访问动态数组或向量中的元素或为其赋值吗
我已经编写了一个小代码,它隔离了我在使用宏访问std::vector中的元素或为其赋值时有缺陷的方法/理解。下面是代码片段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 &
#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];
}
};