【问题标题】:Generating Instances of Different Inherited Classes through Shared Pointers通过共享指针生成不同继承类的实例
【发布时间】:2011-07-05 15:59:33
【问题描述】:

我是 C++ 新手,所以请原谅原始编码技术。我正在尝试找出如何创建一个函数来生成指向不同继承类的共享指针。

class base{
/*.... members ...*/};

class derived1: public base{
/*.... members ...*/

derived1(int){};

~derived1(){};

}

class derived2: public base{
/*.... members ...*/

derived2(int,int){};

~derived2(){};

}

为了创建每个派生策略的多个实例,我有两个不同的函数通过共享指针手动完成。

typedef std::tr1::shared_ptr<Base> Base_ptr_type;

void fn1(int i){
for (t=0;t<=no_instances1;t++)

    Base_ptr_type  p1(new derived1(i));
}

void fn2(int i, int j){
for (t=0;t<=no_instances2;t++)

    Base_ptr_type  p2(new derived1(i,j));
}

我想结合这两个不同的函数。在未来,我将开发更多的派生类,我正在寻找一个函数,你可以将派生类的构造函数参数作为它的参数。沿着

Base_ptr_type p1(new derived1(i));

Base_ptr_type p2(new derived2(i,i);


void Global_fn(int no_instances, Base_ptr_type ptr ){ ??????  }

这样当我们应用 Global_fn(p1) 时,它会生成一些 derived1 和 Global_fn(p2) 的实例,它会根据每个派生类的构造函数参数生成一些 derived2 的实例。

提前感谢您的所有帮助

谢谢伊戈尔。您的解决方案给了我一个链接问题错误 LNK2001:未解析的外部符号!我怀疑您在基类和派生类中的 vitualfunction 不是 void 函数,并且必须返回一些东西?我没有看到下面指向您的代码的 typedef std::tr1::shared_ptr&lt;Base&gt; Base_ptr_type 指针的声明,这是创建具有所需参数的实例所必需的?

    Base_ptr_type p1(new derived1(i));

    Base_ptr_type p2(new derived2(i,i);

再次感谢,

干杯

【问题讨论】:

    标签: c++ inheritance pointers polymorphism


    【解决方案1】:

    您应该使用 factory,独立或作为 base、derived1 和 derived2 的一部分。


    其中一种方法:将重载的create_instance函数添加到所有类中:

    class base{
    public: 
     virtual base* create_instance() = 0;
    };
    
    class derived1: public derived1{
    public: 
     virtual base* create_instance(); // creates derived1
    };
    
    class derived2: public base{
    public: 
     virtual base* create_instance(); // creates derived2
    };
    
    void Global_fn(int no_instances, Base_ptr_type ptr )
    { 
       for (int i = 0; i < no_instances; i++)
         ptr->create_instance(); 
    }
    

    【讨论】:

    • 谢谢伊戈尔。您的解决方案给了我一个链接问题错误 LNK2001:未解析的外部符号!我怀疑您在基类和派生类中的 vitual 函数不是 void 函数,必须返回一些东西?
    • 它报告“未解析的外部符号”,因为我没有实现 create_instance 函数。您必须根据需要添加它们的实现。
    • 虚函数不是void,它返回base*。
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多