C++ 数字和形状超类中的vtable错误

C++ 数字和形状超类中的vtable错误,c++,C++,我在calss Development遇到了困难,他们的超级课程是数字和形状 事实上,我标记了virtual,这导致了很多错误,例如vtable,我仔细检查了stackoverflow中所有关于vtable的帖子,以及void的错误用法,但最终我无法解决这些问题 你能帮我考虑一下吗?我花了一个多星期的时间来思考这个问题,这真的让我很反感,真的 如果我的问题需要更多补充,请不要犹豫发表评论,我很乐意与您互动 NumberMain程序包括复数、分数和带NumberMain的数字 ShapeMain程

我在calss Development遇到了困难,他们的超级课程是数字和形状

事实上,我标记了virtual,这导致了很多错误,例如vtable,我仔细检查了stackoverflow中所有关于vtable的帖子,以及void的错误用法,但最终我无法解决这些问题

你能帮我考虑一下吗?我花了一个多星期的时间来思考这个问题,这真的让我很反感,真的

如果我的问题需要更多补充,请不要犹豫发表评论,我很乐意与您互动

NumberMain程序包括复数、分数和带NumberMain的数字

ShapeMain程序包括圆形、形状、正方形和带有ShapeMain的三角形

Circle.cpp

//此类描述圆的实现
#包括
#包括“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);