班级没有命名成员

时间:2019-02-07 07:48:46

标签: c++

我是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;
}

2 个答案:

答案 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;