无法为此问题找到明确的解决方案。
我有两个班级Point
和Vector
。 Vector
是Point
的孩子。在Point
类的一种方法中,我想使用类Vector
的对象。我是这样做的:
class Point
{
double x, y, z;
public:
// constructor from 3 values
Point(double x, double y, double z)
: x(x), y(y), z(z)
{}
// method move point
Point move(Vector vect, double dist)
{
Vector vectU = vect.unit();
return sum(vectU.multiplyScalar(dist));
}
};
class Vector: public Point
{
double x, y, z;
public:
// constructor from 3 values
Vector(double x, double y, double z)
: Point(x, y, z), x(x), y(y), z(z)
{}
// create unit vector
Vector unit()
{
double len = length();
return Vector(x / len, y / len, z / len);
}
};
当我编译它时,它在行Point move(Vector vect, double dist)
"Vector" has not been declared
中给出了一个错误。我找不到任何有用的答案来解决这个错误。我该如何进行初始化?
答案 0 :(得分:1)
提出前瞻性声明:
class Vector;
在文件的开头。
另外,放一个;在每个班级的定义之后。
答案 1 :(得分:1)
在C ++中,需要在定义类之前声明它。在一个文件中包含所有内容的示例中,当您定义Vector
函数时,它不知道Point::move
是什么。
通常,我们每个类(MyClass.h
等)都有一个头文件,并将函数定义放在每个类的cpp文件中(MyClass.cpp
)
所以你需要重组为:
<强> Point.h:强>
#ifndef _POINT_H
#define _POINT_H
class Vector; // Forward declaration so you don't need to include Vector.h here
class Point
{
double x, y, z;
public:
// constructor from 3 values
Point(double x, double y, double z);
// method move point
Point move(Vector vect, double dist);
}
#endif // _POINT_H
<强> Point.cpp 强>
#include "Point.h"
#include "Vector.h"
// constructor from 3 values
Point::Point(double x, double y, double z)
: x(x), y(y), z(z)
{}
// method move point
Point Point::move(Vector vect, double dist)
{
Vector vectU = vect.unit();
return sum(vectU.multiplyScalar(dist));
}
<强> Vector.h 强>
#ifndef _VECTOR_H
#define _VECTOR_H
#include "Point.h"
class Vector: public Point
{
double x, y, z;
public:
// constructor from 3 values
Vector(double x, double y, double z)
: Point(x, y, z), x(x), y(y), z(z);
// create unit vector
Vector unit();
}
#endif // _VECTOR_H
<强> Vector.cpp 强>
#include "Vector.h"
// constructor from 3 values
Vector::Vector(double x, double y, double z)
: Point(x, y, z), x(x), y(y), z(z)
{}
// create unit vector
Vector Vector::unit()
{
double len = length();
return Vector(x / len, y / len, z / len);
}
(免责声明,不保证会立即编译和工作,这只是为了演示如何拆分代码!)
答案 2 :(得分:0)
如果您的班级Vector
class Vector: public Point
继承自Point
,那么你不应该在基类Vector
中使用Point
(基类不应该知道派生类的任何内容)。
此外,您正在重新定义派生类x, y, z
中的Vector
,这会破坏继承点,并且在使用多态时可能会导致非常讨厌的行为。
答案 3 :(得分:0)
虚拟功能可以帮到你。 即 move()存根于基地 派生中的move()声明。 使用指针进行动态绑定。
例如point * x = new vector(...) x.move()
等等。