C++ 数字和形状超类中的vtable错误
我在calss Development遇到了困难,他们的超级课程是数字和形状 事实上,我标记了virtual,这导致了很多错误,例如vtable,我仔细检查了stackoverflow中所有关于vtable的帖子,以及void的错误用法,但最终我无法解决这些问题 你能帮我考虑一下吗?我花了一个多星期的时间来思考这个问题,这真的让我很反感,真的 如果我的问题需要更多补充,请不要犹豫发表评论,我很乐意与您互动 NumberMain程序包括复数、分数和带NumberMain的数字 ShapeMain程序包括圆形、形状、正方形和带有ShapeMain的三角形 Circle.cppC++ 数字和形状超类中的vtable错误,c++,C++,我在calss Development遇到了困难,他们的超级课程是数字和形状 事实上,我标记了virtual,这导致了很多错误,例如vtable,我仔细检查了stackoverflow中所有关于vtable的帖子,以及void的错误用法,但最终我无法解决这些问题 你能帮我考虑一下吗?我花了一个多星期的时间来思考这个问题,这真的让我很反感,真的 如果我的问题需要更多补充,请不要犹豫发表评论,我很乐意与您互动 NumberMain程序包括复数、分数和带NumberMain的数字 ShapeMain程
//此类描述圆的实现
#包括
#包括“Shape.h”
#包括“Circle.h”
使用名称空间std;
圆和圆::setCenterX(float newX){
centerX=newX;
返回(*本条);
}
圆和圆::setCenterY(float newY){
centerY=newY;
返回(*本条);
}
//此函数用于更改圆的半径。使用验证确保半径>=0。
空心圆::设置半径(浮动新半径){
如果(新半径>=0){
半径=新半径;
}
否则{
cout-imag;
complex1->setReal(real).setvirtual(imag);
返回复数1;
}
//创建并返回一个分数
分数*makeFraction(){
分数*frac1=新分数;
整数;
数值;
cout>denom;
frac1->setNumerator(numer).setDenominator(denom).simplify();
返回分形1;
}
int main(){
数字*num1;
整数型;
cout>numberType;
开关(数字类型){
案例1:num1=makeComplex();break;
案例2:num1=makeFraction();break;
默认值:cout以下是代码中需要注意的几点:
- 任何头文件中都没有头保护,即循环包含相同的文件,从而导致重新定义错误
- 头文件和源文件中的方法名称不同
- 方法链接正在与返回ng
void
type的方法一起使用
- 在某些情况下,函数在头文件中声明,但未在源文件中定义
头文件
在标题文件中使用以下格式:
// Use pragma directive where compilers support this
#pragma once
// ... code ...
否则,请使用如下标题保护:
#ifndef MY_HEADER
#define MY_HEADER
// ... code ...
#endif
complex1->setReal(real).setImaginary(imag);
方法名称
确保头文件和源文件中的方法名称相同
// Test.hpp
class Test
{
public:
void print() const;
};
// Test.cpp
void Test::print() const
{
// ...
}
方法链接
这些方法的链接如下所示:
#ifndef MY_HEADER
#define MY_HEADER
// ... code ...
#endif
complex1->setReal(real).setImaginary(imag);
但是,方法setReal()
和setvirginal()
不返回任何内容,即void
[注意:setvirginal()不存在于头文件中。它是setImag()
,但在源文件中定义为setvirginal()
]
对于链接,这些方法应该返回当前对象的引用
但是,在当前代码中,您需要执行以下操作:
complex1->setReal(real);
complex1->setImaginary(imag);
以上几点只是代码中存在的一些问题。可能还有更多问题。您需要遵循编译器报告的错误并解决这些问题
今后,请创建一个简化代码的应用程序,以便其他人可以轻松地遵循并自行复制代码,以提供适当的响应。以下是您需要注意的代码要点:
- 任何头文件中都没有头保护,即循环包含相同的文件,从而导致重新定义错误
- 头文件和源文件中的方法名称不同
- 方法链接正在与返回ng
void
type的方法一起使用
- 在某些情况下,函数在头文件中声明,但未在源文件中定义
头文件
在标题文件中使用以下格式:
// Use pragma directive where compilers support this
#pragma once
// ... code ...
否则,请使用如下标题保护:
#ifndef MY_HEADER
#define MY_HEADER
// ... code ...
#endif
complex1->setReal(real).setImaginary(imag);
方法名称
确保头文件和源文件中的方法名称相同
// Test.hpp
class Test
{
public:
void print() const;
};
// Test.cpp
void Test::print() const
{
// ...
}
方法链接
这些方法的链接如下所示:
#ifndef MY_HEADER
#define MY_HEADER
// ... code ...
#endif
complex1->setReal(real).setImaginary(imag);
但是,方法setReal()
和setvirginal()
不返回任何内容,即void
[注意:setvirginal()不存在于头文件中。它是setImag()
,但在源文件中定义为setvirginal()
]
对于链接,这些方法应该返回当前对象的引用
但是,在当前代码中,您需要执行以下操作:
complex1->setReal(real);
complex1->setImaginary(imag);
以上几点只是代码中存在的一些问题。可能还有更多问题。您需要遵循编译器报告的错误并解决这些问题
今后,请创建一个简化代码,以便其他人可以轻松地跟随并自行复制,以提供适当的响应。除了我回答中的其他要点外,include
的拼写不正确,即#include“Fraction.h”请注意这些错误。如果你的解决方案工作正常,请考虑询问。如果你走这条路线,阅读链接页面,这样你就可以调整你的问题来适应他们的规则。如果你想让你的问题得到更多的关注,你可能想复习。我没有找到你的问题的正文部分就结束了。你的问题是什么,只是你有一个问题。(更准确地说,你的SO问题的存在告诉我你有一个问题;你的问题的文本只是证实了这一点。)你的第一段既不引人入胜,也没有提供信息。很容易提前停止阅读,把这个问题留给“其他人”。除了
// Use pragma directive where compilers support this
#pragma once
// ... code ...
#ifndef MY_HEADER
#define MY_HEADER
// ... code ...
#endif
// Test.hpp
class Test
{
public:
void print() const;
};
// Test.cpp
void Test::print() const
{
// ...
}
complex1->setReal(real).setImaginary(imag);
complex1->setReal(real);
complex1->setImaginary(imag);