【发布时间】:2018-07-29 09:28:34
【问题描述】:
我正在编写一个名为 Vector 的类,它表示一个 3 维向量。我需要一个构造函数,它可以采用预先存在的 Vector 对象并从中创建一个新对象。这是构造函数:
Vector::Vector(const Vector &v1){
for(int i = 0; i < d; i++)
components[i] = v1.components[i];
}
这是编译器给我的注释:
candidate constructor not viable: no known conversion from 'Vector *'
to 'const Vector &' for 1st argument; dereference the argument with *
Vector::Vector(const Vector &v1){
我还有一个幅度函数:
double Vector::magnitude(){
return std::pow(dot(this, this), 0.5);
}
我来自java,所以我的意思是使用这个类的实例并将它作为向量传递给点函数。我收到以下错误:
error: no viable conversion from 'Vector *' to 'Vector'
return std::pow(dot(this, this), 0.5);
我还有一个单位向量函数,我尝试使用上面的构造函数使用this 创建 Vector 对象的副本。
Vector Vector::getUnitVector(){
Vector unit(this);
unit.scale(1/unit.magnitude());
return unit;
}
我收到以下错误:
error: no matching constructor for initialization of 'Vector'
Vector unit(this);
如何解决这些错误?谢谢。
【问题讨论】:
-
尝试将
this更改为*this,this是一个指针,如果你想引用Vector&你必须先用&取消引用this指针 -
尽管在语法上有一些相似之处,但 C++ 和 Java 是非常不同的语言。从 Java 知识中猜测来学习 C++ 是行不通的。你应该从一本好书中系统地学习它。
-
是的。我只是想我可以为此获得一些具体的帮助。
-
void toString();是一个声明,但不是一个定义。奇怪的是您在头文件中声明它,在另一个源文件中定义它,但要么没有编译那个其他源文件,要么(如果你编译它)没有在链接中包含该对象。 C++ 的一个关键属性是单独编译的模型 - 除非您在构建中明确包含源文件和对象,否则它们不会被神奇地编译或解析函数调用。 -
我投票决定关闭,因为 (1) 您提供了部分信息 - 您需要提供 minimal reproducible example。 (2) 您显然是以“Java 方式”做事,并假设 - 错误地 - 事情在 C++ 中的工作方式相同。这意味着,每次有人试图提供帮助时,都会出现另一个问题。这会浪费人们的时间(他们的工作量比你的大得多),你需要阅读如何用 C++ 做事——包括如何构建程序——而不是假设 C++ 能像 Java 那样做事。
标签: c++ class this copy-constructor this-pointer