访问类变量

时间:2015-01-27 11:01:10

标签: c++ polymorphism getter

我遇到了访问对象的问题,该对象是类的变量。继承和关系如下:

#include "X.h"

class Y
{   
    X object; 

public:
    X & getObject();
};

然后是另一个文件/类:

#include "Y.h"

class Z : public Y
{
    X object2;
public:
    X & getObject2();
};

最后是一个获得对象指针向量的类。

 #include "Z.h"

 class XYZ
 {
    vector<Y*> cont;  //contains objects of class type Z and Y
 };

如果我想访问object变量,我只需编写

cont[index]->getObject();

但是没有办法访问object2,编译器甚至没有看到像getObject2()这样的方法。我认为我的描述并不清楚,但无论如何我希望你会帮助我。

4 个答案:

答案 0 :(得分:1)

您的第一个问题是确定是否可以调用getObject2方法。代码中的注释表示向量包含两种类型的对象,那么如何确定任何一个特定对象是Z而不只是Y?如果是Y,则getObject2方法不可用,您不能尝试调用它。

您有几种选择。以下是其中一些:

  • 一种解决方案是对两种不同的类型使用两个单独的向量:

    vector<Y*> conty;
    vector<Z*> contz;
    

    但是,这不会维持不同对象类型之间的排序。这是否有问题取决于你的目的。

  • 另一种解决方案是将指针强制转换为所需类型 -

    (Z *)(cont[index])->getObject2();
    

    ...但是如果您知道指向对象的实际类型,则只能执行此操作。如果您不确定,可以使用dynamic_cast

    Z *z = dynamic_cast<Z *>(cont[index]);
    if (z != nullptr) {
        z.getObject2();
    }
    
  • 另一个解决方案是将getObject2添加到基类Y中,并将其设置为虚拟,以便可以在Z中覆盖它。您可以在Y中执行实施,只需返回nullptr即可。您需要更改getObject2的返回类型,以便它返回指针而不是引用。

    class Y
    {   
        X object; 
    
    public:
        X & getObject();
        virtual X * getObject2();
    };
    

哪种选择最好取决于您的具体要求。

答案 1 :(得分:1)

您似乎需要虚拟功能。您的代码可能会以这样的方式更改:

#include "X.h"

class Y
{   
    X object; 

public:
    virtual X & getObject()
    {
        return object;
    }

};

#include "Y.h"

    class Z : public Y
    {
        X object2;
    public:
        virtual X & getObject()
        {
            return object2;
        }
    };

所以在任何

的召唤下
cont[index]->getObject();

在运行时,查看某个实体的虚拟表,指向cont [index]的指针。如果它是指向Y对象的指针,则调用Y类的getObject(),如果它是指向Z对象的指针,则调用Z类的getObject()。

答案 2 :(得分:0)

如果您想要尝试 来呼叫object2(),您可以尝试使用dynamic_cast来输入Z*。在documentation中,您有关于如何使用它的完整说明(例如:如果您将指针传递给Y类型的对象,它将无法返回NULL指针)

Z* p_z = dinamic_cast<Z*> (cont[index])
if (p_z)
   std::cout << p_z->getObject2();

答案 3 :(得分:0)

contY*的向量。这意味着其成员仅公开Y类中定义的API。 getObject2()仅在其后代上定义。即使向量中的成员实际上是Z的实例,只要它们作为Y类型的实例进行访问,那么只有Y的接口可用。

如果您希望getObject2()可用,则需要执行以下三项操作之一:
1.向getObject2()添加虚拟Y方法 2.将getObject2()功能完全移至Y
3.将cont设为vector<Z*>