【问题标题】:c++ creating object inside the classc ++在类中创建对象
【发布时间】:2013-06-16 21:25:48
【问题描述】:

我已经创建了 2 个类。一个叫做 Shape,它是一个虚拟类。另一个叫做 Circle(我打算创建更多的类,例如:三角形、正方形 ....)。我想找到圆形区域对象,但这并不重要。这是我的问题。当我想创建这样的对象时:

vector<Shape *> mStack;
Shape *newShape = NULL;
newShape = new Circle(10.6);
mStack.push_back(newShape);

我可以毫无问题地在主文件中创建它。但是当我尝试在“Shape”类中创建它的函数时……像这样:

void Shape::Create()
{
    Shape *newShape = NULL;
    newShape = new Circle(10.6);
    mStack.push_back(newShape);
}

我收到以下错误:语法错误:标识符 'Circle'

...这是我的课程。

#pragma once
#include <vector>

using namespace std;

class Shape
{

private:
    vector<Shape *> mStack;
public:
    Shape();
    ~Shape(void);

    virtual double Circle_area() = 0;   


};


*********************************************************

#pragma once
#include "Shape.h"

class Circle : public Shape
{
private:
    double m_r;
public:
    Circle();
    Circle(double r);
    ~Circle(void);

    double Create();
    double Circle_area();
};

问题出在哪里?如何在父类中创建对象?我希望你明白我想说什么。感谢您的帮助。

【问题讨论】:

  • 你的设计不是很好:基类不应该知道它的派生类型,所以Shape应该不知道Circles。
  • @juanchopanza,除非它用于命中测试并且我猜每个形状都需要提供一个圆形的命中框。
  • 您是否在“shape.cpp”中包含了“circle.h”(假设这是您放置void Shape::create() 函数的位置)?
  • @chris 这可能通过Shape 接口的多态性来实现。
  • 我认为你的意思是使用函数名 area() 而不是 circle_area() 因为这违背了多态性的全部目的。

标签: c++ class object virtual


【解决方案1】:

您的设计现在不正确。通过适当的设计,您的形状可以充当真正的圆形或矩形的abstract classbase class。如果那么你的设计将是。,

您可以在main() 中维护一个不会产生问题的形状列表vector&lt;Shape *&gt; mStack;但你不能在形状上创建circle or rectangle。在我看来,这是一个错误的设计。

【讨论】:

    【解决方案2】:

    你的基类很奇怪。

    • 基类应该有虚拟析构函数
    • 有一个自身的集合可能会超出范围(您可能有一个 CompositeShape 向下层级...)
    • 它有一个名为子类的函数。 (可以是 shape_area() 或只是 area())

    您的实现问题也来自此:如果集合不成形,则 create 不想填充它,问题就消失了。

    从提供的信息来看,并不清楚 create 的内容应该去哪里,可能是应用程序,或者可能是一些特定的复杂形状——那些可能只是包含所有必需的标题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多