我有一个来自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);
};
但这不编译!在更改每个步骤中的指针参数后,如何使用指针重新创建派生类的多个实例。
答案 0 :(得分:3)
这段代码太可怕了。
一些建议:
class base{
base(){};
~base(){}
};
class derived : public base{
};
为了从base派生,构造函数和析构函数需要是公共的或受保护的。
*base b1(new (derived(b));
指针声明为:
TYPE* name;
base b1(new (derived(b));
因为你需要一个构造函数,它将指向derived
对象的指针作为参数。
答案 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;
其中ptype
是TYPE *
类型的变量(指向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 ++。