C++ 与指针混淆
我试图复制Java书中的桥接模式,但陷入了指针困境,因为我是新手。我扔掉了include和部分实现,因为它就在那里C++ 与指针混淆,c++,C++,我试图复制Java书中的桥接模式,但陷入了指针困境,因为我是新手。我扔掉了include和部分实现,因为它就在那里 // main.cpp int main () { DrawApi *rc = new RedCircle(); Circle redCircle = new Circle(rc); redCircle.draw(); } // DrawApi.h class DrawApi { public: virtual void drawCircle()
// 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的指针
Circle redCircle = new Circle(rc);
如果要从Circle*
初始化(复制构造)一个Circle
,则需要一个构造函数,比如Circle(Circle*)
我想,实际上,您只需要初始化
rc
中的圆圈。由于rc
是DrawApi*
,并且Circle
有一个以DrawApi*
为参数的构造函数,因此a.k.aCircle(DrawApi*mDrawApi)
。你可以简单地写:
Circle redCircle(rc);
redCircle.draw();
如果我错了,那么也许:
Circle *redCircle = new Circle(rc);
redCircle->draw();
出于两个原因,我更喜欢第一个版本:
- 他们都在呼吁圈的抽签,而不是基地的
DrawApi
也有一个虚拟成员函数,您已经有了
进行了从派生到基的转换
顺便说一句,你的程序有一些严重的内存管理问题。在进一步研究之前解决这些问题将是一个不错的选择。(智能指针会给你很大帮助)
类型obj(x)
和类型obj=x
DrawApi*rc=new RedCircle()代码>?你是说DrawApi*rc=newdrawapi()代码>?圆圈红色圆圈=新圆圈(rc)代码>至少应为圆圈*红色圆圈=新圆圈(rc)代码>(正如编译器告诉您的)-和redCircle.draw()代码>将是redCircle->draw()代码>。但我不确定您为什么要使用指针和new
来执行此操作代码>应该是redCircle->draw()
同样,每一个新的
都需要相应的删除
,否则会导致内存泄漏Hank伙计们,尤其是邪恶的绵羊!此项工作:圆圈*红色圆圈=新圆圈(rc);红色圆圈->绘图();我想你喜欢把初学者弄糊涂D我只使用Circle*redCircle=新的圆(rc)代码>或更好,只需<代码>圈出红色圆圈(rc)代码>。谢谢,它工作得很好。我不完全理解建筑圈红圈(rc);但它是有效的。