- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在创建一个矩阵类(主要用于 self 练习,我知道 Eigen)。我在其中定义了矩阵乘法,正如人们所期望的那样——该方法采用对 Matrix 对象的 const 引用并返回 Matrix 对象。
Matrix Matrix::operator *(const Matrix& rhs) const
{
Matrix temp(mRows,rhs.mCols);
... //do Matrix Multiplication
return temp;
}
然后我派生了一个 DCM 类(方向余弦矩阵——只是一种特殊的矩阵)。
class DCM: public Matrix
{
.... // class definition here, but does NOT contain definition for
// matrix multiplication
};
我可以创建两个 DCM 对象并将它们相乘没问题,但返回的对象是 Matrix 类型。
DCM Rvb_q(q);
DCM Rvb_p(p);
DCM Rvb_pq(Rvb_p*Rvb_q); // error because Rvb_p*Rvb_q returns a Matrix object
有没有办法让该函数返回一个 DCM 对象,而不必在派生类中重新编码该函数?一种方法是将此构造函数添加到派生类中:
DCM(const Matrix &M):Matrix(M) {}
但这似乎真的很低效(为乘法创建一个新对象,然后在创建 DCM 对象时复制它)和限制(任何时候我将两个 DCM 对象相乘,我必须为 Matrix 创建一个新的 DCM 对象要复制到的对象——我不能只将返回的对象用作 DCM)。有没有办法重用基类函数,但它返回派生类类型?
最佳答案
您可以使用 Curiously Recurrent Template Pattern 来实现. CRTP 是一种习语,其中类继承自模板类,并将其作为模板参数。例如:
template<typename T>
struct CRTP_base {};
struct foo : public CRTP_base<foo> {};
这个习语的力量在于基类知道什么类从它派生。您可以使用该属性来解决您的问题:
template<typename T>
struct matrix_base
{
T& operator*=(const T& rhs)
{
/* Multiplication code */
return static_cast<T&>(*this);
}
};
struct DCM : public matrix_base<DCM> {};
int main()
{
DCM a,b c;
a *= b; //OK, call to matrix_base<DCM>::operator*, which expects a DCM as parameter,
//and returns a reference to a DCM.
}
关于c++ - 基类方法返回派生类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19194233/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!