使用抽象指针

时间:2018-01-08 00:21:06

标签: c++ abstract-class

我第一次使用纯虚函数和接口,但遇到了一些麻烦,可能是因为我没有完全理解一些基础知识。

在main函数中,我试图创建一个派生类的对象“a”,它在类中创建另一个对象“obj”,并将obj的成员变量设置为某个值。 稍后在main函数中,我想打印obj的成员变量。

Errorived类“AbstractB”在DerivedA.h中没有成员“setVar”。 setVar函数不是抽象类的一部分,因为在不同的派生类中,var可能具有不同的数据类型。

AbstractA.h

class AbstractA
{
public:
    AbstractA() {}
    virtual ~AbstractA() {}

    virtual void buildObj() = 0;
    AbstractB* getObj() { return obj; }

protected:
    AbstractB* obj;
};

AbstractB.h

class AbstractB
{
public:
    AbstractB() {}
    virtual ~AbstractB() {}

    virtual void doSthWithVar() = 0;

    // All derived classes have a private member variable var of varying data types
};

DerivedA.h

 class DerivedA: public AbstractA
 {
 public:
    // buildObj() creates some numbers e.g. 1
    void buildObj() { obj->setVar( 1 ); } // Error due to calling the function using the abstract class instead of the derived one
 };

DerivedB.h

class DerivedB
{
public:
    void setVar( int i ) { var = i; }
    void doSthWithVar(){ std::cout << var << std::endl; }

private:
    int var;
};

的main.cpp

int main()
{
    DerivedA a;
    a.buildObj(); // Creating a DerivedB object which is holding a variable var

    // I want to do something like this
    AbstractB* obj = a.getObj();
    obj->doSthWithVar(); // Should print 1
}

有没有办法在DerivedA.h中调用setVar()函数以允许以后检索var而不会干扰抽象类的结构?

修改

我通过以下方式实施了Robert Andrzejuk的解决方案:

class DerivedA: public AbstractA
{
public:
    void buildObj() 
    { 
        DerivedB* b = new DerivedB();
        b->setVar( 1 );
        obj = b;
    }
};

1 个答案:

答案 0 :(得分:1)

我不知道您在哪里创建了DerivedB的实例?

DerivedA中最符合逻辑的地方。 这就是你拥有调用所需功能的所有信息的地方。

class DerivedA: public AbstractA
{
   DerivedB b;
public:
   // buildObj() creates some numbers e.g. 1
   void buildObj() 
   { 
        b.setVar( 1 );
        obj = &b; 
   }
};