【发布时间】:2011-05-20 12:29:02
【问题描述】:
我一直在寻找解决此问题的方法,但似乎找不到。我确信这个一般性问题之前已经在某个地方被问过,但希望你能帮助我解决我的具体情况......
我有一个类模板someClass,其中包含以下(私有)成员:
int size_x;
int size_y;
int size_total;
T * grid;
someClass 包含一个如下所示的构造函数:
someClass (const int x, const int y)
: size_x (x), size_y (y), size_total (x*y)
{
grid = new T [size_total];
}
如下所示的复制构造函数:
someClass (const someClass & rhs)
{
size_x = rhs.size_x;
size_y = rhs.size_y;
size_total = rhs.size_total;
grid = new T [size_total];
memcpy(grid, rhs.grid, size_total*sizeof(T));
}
一个看起来像这样的成员函数:
T * retGrid (void) const
{
return grid;
}
还有一个如下所示的赋值运算符:
someClass & operator= (const someClass & rhs)
{
if (this != &rhs)
{
size_x = rhs.size_x;
size_y = rhs.size_y;
size_total = rhs.size_total;
grid = new T [size_total];
memcpy(grid, rhs.grid, size_total*sizeof(T));
}
return *this;
}
我正在尝试传递以下两个 someClass 对象
someClass<double> *I1 = new someClass<double>(10,10);
someClass<double> I2 = *I1;
到具有以下原型的someClass 类之外的函数:
int someFunction(double *arr);
这个调用工作正常:
int status;
status = someFunction(I1->retGrid()); // Properly working function call
但这不是
status = someFunction(&I2.retGrid()); // Compiler gives error that says "error: invalid lvalue in unary &"
如果我像这样打电话给someFunction:
status = someFunction(I2.retGrid()); // Compiler gives no error but function returns error value in status
代码编译,但我得到一个运行时错误(来自someFunction 中另一个函数调用的错误状态值)。
如何正确地将I2 传递给someFunction?
非常感谢...
【问题讨论】:
-
你需要定义一个拷贝构造函数。
-
谢谢 Neil,我的代码中确实有一个复制构造函数,但我没有在这篇文章中使用它。我现在编辑了帖子以包含它。
-
你能检查 I2 的内容吗(例如,将它们转储出来或在调试器中检查)?是否从 I1 正确复制? (我猜你的“坏状态值”可能以某种方式反映了传递的双精度数组的内容。)
-
复制构造函数对模板的所有实例化表现出未定义的行为,其中
T是非 POD。您应该将memcpy替换为对std::copy(rhs.grid, rhs.grid+rhs.size_total, grid)的调用。
标签: c++ class function pointers