如何通过函数在堆上创建具有不同参数的多个派生对象

时间:2011-12-12 12:19:09

标签: c++ inheritance pointers

我有一个来自base的派生类:

class base{ 
public:
base(){};
~base(){}
};

class derived : public base{
public:
derived(int & input): a(input){};
~derived(){};

int a;
};

我有一个指针,可以在堆上启动派生类,如下所示

main()
{
int b=10;
base * b1;
b1=new derived(b);
factory(b1,5);
    }

我想将这个指针b1传递给函数工厂,以便在更改b的值之后重新创建b1的多个实例,如:

    void factory(base *p_base,int input_integer)
{
    for(int m=0; m<=input_integer,m++){
    b=m;
    base *b1_duplicate (new p_base);
};

但这不编译!在更改每个步骤中的指针参数后,如何使用指针重新创建派生类的多个实例。

2 个答案:

答案 0 :(得分:3)

这段代码太可怕了。

一些建议:

1)以下是非法的:

class base{ 
base(){};
~base(){}
};

class derived : public base{
};

为了从base派生,构造函数和析构函数需要是公共的或受保护的。

2)以下是错误的:

*base b1(new (derived(b));

指针声明为:

TYPE* name;

3)这不起作用

base b1(new (derived(b));

因为你需要一个构造函数,它将指向derived对象的指针作为参数。

4)你的工厂方法会让我的眼睛受伤。

答案 1 :(得分:0)

你的C ++语法完全关闭......对于这个问题,完全没有C ++或C编程的意义。这看起来好像你正在尝试从javascript类型继承或同样丑陋的东西中派生出一些概念。

这是家庭作业吗?您定义的工厂功能毫无意义。即使您创建了b的多个实例,您在工厂中使用这些实例做了什么?

您对变量的声明完全不正确。在尝试编程之前,您需要阅读C ++入门。

好的,现在走上正确的道路:

为了声明一个具有派生类的类,创建者和析构函数必须是公共的或受保护的范围。默认情况下(如果您没有指定范围),它是该类的私有。

另外,如果你的派生类有一个析构函数,那么base析构函数必须是虚函数。

所以:

class Base { 
      public Base() { }
      public virtual ~Base() { }
};

class Derived : public Base {

      int a;

      public Derived(int _a) : a(_a) { Base(); }
      public virtual ~Derived() { }
};

您正在混淆解除引用指针的语法,并声明指向类型的指针。因此,声明类型TYPE的指针如下:

   TYPE * ptype;

其中ptypeTYPE *类型的变量(指向TYPE的指针)

e.g。

   int *pnum;

pnum保存指向整数类型的内存位置的地址。

您可以使用pnum指向一个整数:

   int x = 5;
   pnum = &x;  // read this line as 'pnum refers to x' or 'pnum points to x' or
               // pnum is the memory address of x.

如果要访问pnum指向的整数值,可以&#34;取消引用&#34;您使用*pnum

的内存指针
   cout << "Address of x in memory (stored in pnum) is: " << pnum << endl
        << "Value of x (pointed to by pnum is: " << *pnum << endl;

所以要声明一个指向基类的指针:

   Base *b;

使用基类指针实例化派生类:

   b = new Derived(10);

为了实例化其中的一些并在数组中保存实例:

   int count = 10;
   Base **b = new Base[count];

   for (i = 0; i < count; i++) {
          b[i] = new Derived(i);
   }

如果这有任何混淆......我的意思是你挣扎超过30秒来理解它。然后它表明你需要从头开始学习C ++。