我第一次使用纯虚函数和接口,但遇到了一些麻烦,可能是因为我没有完全理解一些基础知识。
在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;
}
};
答案 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;
}
};