开始学习 Eric 和 Elizabeth Freeman 的《设计模式》一书。我正在尝试从 C++ 的第一章编写架构。
如何在 Duck (RedheadDuck) 后继者的构造函数中将 FlyWithWings 分配给 FlyBehaviour 指针?FlyWithWings 有一个静态函数,我不想在 main() 的某个地方创建一个实例,然后将它传递给构造函数,是否有可能以某种方式避免这种情况?
编码:
class FlyBehaviour {
public:
static virtual void fly() = 0;
};
class FlyWithWings : public FlyBehaviour {
public:
static void fly() {
cout << "I'm flying with wings!" << endl;
}
};
class Duck {
private:
FlyBehaviour *flyBehaviour;
public:
virtual void display() = 0;
void fly() {flyBehaviour->fly();}
};
class RedheadDuck : public Duck {
RedheadDuck() {
// Как присвоить flyBehaviour указатель на FlyWithWings?
}
void display() {
cout << "I'm redhead duck." << endl;
}
};
谢谢大家,我这样做了:
class FlyBehaviour {
public:
virtual void fly() = 0;
};
class FlyWithWings : public FlyBehaviour {
public:
void fly() {
cout << "I'm flying with wings!" << endl;
}
};
class Duck {
protected:
FlyBehaviour *flyBehaviour;
public:
Duck() {flyBehaviour = nullptr;}
virtual void display() = 0;
void fly() {flyBehaviour->fly();}
~Duck() {delete flyBehaviour;}
};
class RedheadDuck : public Duck {
public:
RedheadDuck() {
Duck::flyBehaviour = new FlyWithWings;
}
void display() {
cout << "I'm redhead duck." << endl;
}
};
要将指针分配给实例,
FlyWithWings
必须首先创建该实例,这是不可能的,因为它是一个抽象类,因为它没有实现fly
. 内置的多态系统不允许静态虚方法。所以这static virtual void fly() = 0;
是一个语法错误。使方法非静态,在 中实现它FlyWithWings
,创建一个实例FlyWithWings
,并将指针设置为该实例的地址。如果您不需要存储任何状态,那么您可以使用指向方法的指针而不是指向类的指针。如果我理解正确,那么:
如您所见,这里缺少 Duck 的相应构造函数。
如果不想每次初始化时都明确指出需要初始化什么,那么设置默认参数:
因此,如果您在初始化期间不传递任何参数,则将使用默认参数,但如果您需要不同的参数,则必须在显式初始化时使用它。
最主要的是,由于您正在使用指针,因此在析构函数中提供内存释放,或使用智能指针