試圖創建一個驅動程序類型類,其中,下面的Base是在實例化時傳遞類型的驅動程序。在這種情況下,類型2用於構造正確的派生對象。從基類實例化派生對象
我的編譯器在「Class Base」行上拋出了一個Declaration語法錯誤。
我的最終目標是能夠做到這一點:
Base *B;
B = new Base(2);
if(B)
{
B->DoStuff();
B->DoMoreStuff();
delete B;
}
這裏是我的代碼將無法編譯...
class Base
{
public:
Base(int h);
virtual ~Base();
private:
int hType;
Base *hHandle;
};
class Derived1 : public Base
{
public:
Derived1();
virtual ~Derived1();
};
class Derived2 : public Base
{
public:
Derived2();
virtual ~Derived2();
};
Base::Base(int h)
{
hType = h;
switch(h)
{
case 1:
hHandle = new Derived1;
break;
case 2:
hHandle = new Derived2;
break;
}
}
Derived1::Derived1():Base(1)
{
printf("\nDerived1 Initialized\n\n");
}
Derived2::Derived2():Base(2)
{
printf("\nDerived2 Initialized\n\n");
}
下面是更新後的代碼,以顯示完整的源代碼。我想我現在明白爲什麼它不會編譯。正如下面指出的,我有一個無限循環呼叫'新'
#include <stdio.h>
class Base
{
public:
Base();
Base(int h);
Create (int h);
virtual ~Base();
private:
int hType;
Base *hHandle;
};
class Derived1 : public Base
{
public:
Derived1();
virtual ~Derived1();
};
class Derived2 : public Base
{
public:
Derived2();
virtual ~Derived2();
};
Base::Base()
{
}
Base::Base(int h)
{
Create(h);
}
Base::Create(int h)
{
hType = h;
switch(h)
{
case 1:
hHandle = new Derived1;
break;
case 2:
hHandle = new Derived2;
break;
}
}
Derived1::Derived1()
{
printf("\nDerived1 Initialized\n\n");
}
Derived2::Derived2()
{
printf("\nDerived2 Initialized\n\n");
}
錯誤的文字是什麼?如果它指的是你的代碼片段的第一行,那不*看*錯誤。 – ssube 2011-04-16 03:19:49
運行時怎麼樣?當你創建一個Base(1)時,構造函數創建一個新的Derived,它調用它的基類Base(1),它創建一個新的Derived,它調用它的基類... – 2011-04-16 10:48:47
@Eric:請使用'std :: unique_ptr','boost :: scoped_ptr'或'std :: auto_ptr'(後者更糟糕)。你的玩具樣品有內存泄漏:/ – 2011-04-16 14:18:36