我试图从Java书中重现 Bridge模式,但是因为我是新手而陷入困境。我扔掉了包含和部分实现,因为那里只有 printf :
// main.cpp
int main () {
DrawApi *rc = new RedCircle();
Circle redCircle = new Circle(rc);
redCircle.draw();
}
// DrawApi.h
class DrawApi
{
public:
virtual void drawCircle() = 0;
};
// Shape.h
class DrawApi;
class Shape
{
protected:
DrawApi *drawApi;
public:
Shape(DrawApi *mDrawApi) : drawApi(mDrawApi) {}
virtual void draw() = 0;
};
// Circle.h
class Circle : public Shape {
public:
Circle(DrawApi *mDrawApi) : Shape(mDrawApi) {}
void draw();
};
编译并运行后出错:
$ g++-5 -std=c++14 -g main.cpp RedCircle.cpp Circle.cpp && ./a.out && rm a.out
main.cpp: In function ‘int main()’:
main.cpp:7:46: error: conversion from ‘Circle*’ to non-scalar type ‘Circle’ requested
Circle redCircle = new Circle(rc);
Shape ctor正在等待指向DrawApi的指针,但似乎得到了一个对象。我以为我声明了rc变量作为指向DrawApi的指针。
答案 0 :(得分:1)
Circle redCircle = new Circle(rc);
如果要从Circle
初始化(复制构造)Circle *
,则需要构造函数,例如Circle(Circle *)
。
我想,实际上,您只想从Circle
初始化rc
。由于rc
为DrawApi *
,Circle
有一个以DrawApi *
为参数的构造函数,a.k.a Circle(DrawApi *mDrawApi)
。你可以简单地写一下:
Circle redCircle(rc);
redCircle.draw();
如果我错了,那么可能:
Circle *redCircle = new Circle(rc);
redCircle->draw();
我更喜欢第一个版本有两个原因:
DrawApi
也有一个虚拟成员函数,你已经有了
进行了衍生到基础的转换。 Type obj(x)
和Type obj = x
之间存在细微差别。