Cố gắng tạo lớp loại Trình điều khiển ở nơi, bên dưới, Cơ sở là Trình điều khiển được truyền qua loại lúc khởi tạo. Loại, 2 trong trường hợp này, được sử dụng để xây dựng đối tượng có nguồn gốc chính xác.Khởi tạo đối tượng có nguồn gốc từ lớp Cơ sở
Trình biên dịch của tôi đang ném một lỗi cú pháp khai báo trên dòng "Lớp cơ sở".
mục tiêu cuối cùng của tôi là để có thể làm điều này:
Base *B;
B = new Base(2);
if(B)
{
B->DoStuff();
B->DoMoreStuff();
delete B;
}
Đây là mã của tôi rằng sẽ không biên dịch ...
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");
}
Dưới đây được cập nhật mã để hiển thị các nguồn đầy đủ . Tôi nghĩ rằng bây giờ tôi hiểu tại sao nó sẽ không biên dịch. Như được chỉ ra bên dưới, tôi có một chuỗi cuộc gọi vô tận tới 'mới'
#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");
}
Nội dung của lỗi là gì? Nếu nó đề cập đến dòng đầu tiên của đoạn mã của bạn, điều đó không * nhìn * sai. – ssube
Còn thời gian chạy thì sao? Khi bạn tạo một Base (1), hàm tạo tạo một Derived mới, gọi là lớp cơ sở của nó, Base (1), tạo ra một Derived mới, gọi là lớp cơ sở của nó ... –
@Eric: hãy sử dụng một trong hai std :: unique_ptr', 'boost :: scoped_ptr' hoặc' std :: auto_ptr' (sau này trở nên tệ hơn). Bạn bị rò rỉ bộ nhớ trong mẫu đồ chơi của mình:/ –