我是c ++的新手,正在尝试了解其面向对象的设计。我启动了一个小项目来测试继承性和多态性,但是遇到了一个问题,看不到出了什么问题。
每次编译时,都会出现错误“类'ShapeTwoD'没有成员名称getx()和gety()” 。我试图用setx和sety直接设置x和y值,但它仍然返回相同的错误。
ShapeTwoD类是仅包含变量“名称”和“容器”的基类。如果有人可以引导我朝正确的方向前进,将不胜感激。
Main.cpp
#include <iostream>
#include <string>
#include "ShapeTwoD.h"
#include "Square.h"
using namespace std;
int main()
{
cout<<endl;
ShapeTwoD *shape2D[100];
ShapeTwoD *sq1 = new Square("Square", true, 4, 6);
cout << sq1->getName() <<endl;
cout << sq1->getContainer() <<endl;
//sq1->setx(4) <<endl;
//sq1->sety(6) <<endl;
cout << sq1->getx() <<endl;
cout << sq1->gety() <<endl;
cout<<endl;
delete sq1;
}
Square.h
#include <iostream>
#include <string>
#include "ShapeTwoD.h"
using namespace std;
class ShapeTwoD; //forward declare
class Square : public ShapeTwoD
{
public:
int x;
int y;
//constructor
Square(string name, bool container,int x, int y);
int getx();
int gety();
void setx(int x);
void sety(int y);
};
Square.cpp
#include <iostream>
#include <string>
#include "Square.h"
#include "ShapeTwoD.h"
Square::Square(string name, bool containsWarpSpace, int coordx, int coordy)
:ShapeTwoD(name, containsWarpSpace)
{
(*this).x = coordx;
(*this).y = coordy;
}
int Square::getx()
{
return (*this).x;
}
int Square::gety()
{
return (*this).y;
}
void Square::setx(int value)
{
(*this).x = value;
}
void Square::sety(int value)
{
(*this).y = value;
}
答案 0 :(得分:1)
那是正常的...如果将sq1声明为ShapeTwoD,则可以访问ShapeTwoD公共成员方法/属性。即使使用Square构造函数也可以实例化。将其转换为Square,即可使用getx gety。或将getx / gety声明为ShapeTwoD的方法。
答案 1 :(得分:0)
这是您应该期望的,因为它具有shape2D类型,尽管使用Square构造函数构造它不会允许您访问派生的类成员,但是它将允许您进行安全的类型转换以使用它。最简单的方法是:
cout << static_cast<Square*>(sq1)->getx() << endl;
cout << static_cast<Square*>(sq1)->gety() << endl;