如何声明具有在声明下定义的类型的参数的函数?
How do I declare a function that has a parameter of a type that's defined below the declaration?
我正在尝试实现自定义Vector2(2D向量(和Matrix2(2x2矩阵(类。我想定义一个函数,该函数对矢量执行仿射变换,就好像它是 2D 空间中的一个点一样。为此,我需要传递转换矩阵、可选的转换原点和可选的转换。
我希望这个函数成为我的 Vector2 类的成员。但是,我对 Matrix2 的定义位于定义此函数的 Vector2 定义下方。结果,当我尝试编译代码时,出现编译错误:
C2061 语法错误:标识符"矩阵 2">
我的 Matrix2 定义包括一个将矩阵乘以向量的函数,所以我需要在 Vector2 之后定义 Matrix2。
下面是代码,省略了不相关的成员:
#pragma once
namespace AWUtils
{
struct Vector2
{
double x;
double y;
// default constructor, produces the zero vector
Vector2()
{
zero();
}
// copy constructor, copies the given vector
Vector2(const Vector2* v)
{
x = v->x;
y = v->y;
}
// turns this vector into the zero vector
void zero()
{
x = 0;
y = 0;
}
// returns a new vector equal to this vector plus the given vector
Vector2 add(Vector2 v)
{
return Vector2(x + v.x, y + v.y);
}
Vector2 operator + (Vector2 v)
{
return add(v);
}
Vector2 operator - (Vector2 v)
{
return add(v * -1);
}
// affine transformation
Vector2 transform(Matrix2 matrix, Vector2 origin = Vector2(), Vector2 translation = Vector2())
{
Vector2 me(this);
return (matrix * (me + translation - origin)) + origin;
}
};
struct Matrix2
{
double a;
double b;
double c;
double d;
// vector multiplication
Vector2 multiply(Vector2 v)
{
return Vector2(a * v.x + b * v.y, c * v.x + d * v.y);
}
Vector2 operator * (Vector2 v)
{
return multiply(v);
}
};
}
我是否必须在其他地方定义此函数?我想过也许在 Matrix2 下定义它,但我希望它是一个成员函数。任何帮助(包括代码批评,我已经做了不到两周C++(将不胜感激。
当你有两个相互依赖的类时,你需要转发声明其中一个类并移动成员函数的实现,以便在函数实现之前完成类定义。
namespace AWUtils
{
// Forward declaration.
struct Matrix2;
struct Vector2
{
...
// Declare
// affine transformation
Vector2 transform(Matrix2 matrix, Vector2 origin = Vector2(), Vector2 translation = Vector2());
};
struct Matrix2
{
...
};
// Define
// affine transformation
Vector2 Vector2::transform(Matrix2 matrix, Vector2 origin, Vector2 translation)
{
Vector2 me(this);
return (matrix * (me + translation - origin)) + origin;
}
}
定义应与声明分开,并且必须在Vector2
之前声明struct Matrix2
。
struct Matrix2;
在Vector2
Vector2 transform(const Matrix2& matrix, Vector2 origin = Vector2(), Vector2 translation = Vector2());
Vector2
和Matrix2
之后
Vector2 Vectors::transform(const Matrix2& matrix, Vector2 origin, Vector2 translation)
{
Vector2 me(this);
return (matrix * (me + translation - origin)) + origin;
}
此外,这些方法应该是常量
Vector2 multiply(Vector2 v) const
{
return Vector2(a * v.x + b * v.y, c * v.x + d * v.y);
}
Vector2 operator * (Vector2 v) const
{
return multiply(v);
}
相关文章:
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定