Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与指针混淆_C++ - Fatal编程技术网

C++ 与指针混淆

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()

我试图复制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() = 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.a
Circle(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);但它是有效的。