CShape[10] shapes; // массив объектов CShape //... здесь заполняем массив производными объектами for (int i=0; i<10;i++) { //--- тип и площадь фигуры Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea()); };
不太清楚应该怎么做
//... здесь заполняем массив производными объектами
CShape[10] shapes; // массив объектов CShape //... здесь заполняем массив производными объектами for (int i=0; i<10;i++) { //--- тип и площадь фигуры Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea()); };
我不太清楚应该怎么做。
//... здесь заполняем массив производными объектами
//+------------------------------------------------------------------+ //| test.mq5 | //| Ya | //| Ya | //+------------------------------------------------------------------+ #property copyright "Ya" #property link "Ya" #property version "1.00" #property indicator_chart_window //--- Базовый класс class CShape { protected: int m_type; // тип фигуры int m_xpos; // X - координата точки привязки int m_ypos; // Y - координата точки привязки public: void CShape(){m_type=0;}; // конструктор, тип равен нулю int GetType(){return(m_type);};// возвращает тип фигуры virtual double GetArea(){return (0); }// возвращает площадь фигуры };
//--- производный класс Круг class CCircle: public CShape // после двоеточия указывается базовый класс, { // от которого производится наследование private: double m_radius; // радиус круга
public: void CCircle(){m_type=1; m_radius=10;}; // конструктор, тип равен 1 void SetRadius(double r){m_radius=r;}; double GetArea(){return (3.14*m_radius*m_radius);}// площадь круга };
//--- производный класс Квадрат class CSquare: public CShape // после двоеточия указывается базовый класс, { // от которого производится наследование private: double m_square_side; // сторона квадрата
public: void CSquare(){m_type=2;}; // конструктор, тип равен 2 void SetSide(double s){m_square_side=s;}; virtual double GetArea(){return (m_square_side*m_square_side);}//площадь квадрата }; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() {
CShape shape[10]; // массив объектов CShape //... здесь заполняем массив производными объектами CCircle circle; shape[1]=circle;
Print("Объект типа "+shape[1].GetType()+" имеет площадь "+ shape[1].GetArea()); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //---
//--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
即使假设祖先中的void Del(C_A *p)足以删除任何后代的指针,我认为使用
这是另一个问题:)--权宜之计的问题。我对这种做法的正确性/文盲性问题感兴趣。
只要正确删除指针,所有选项似乎都不错。
而且,它似乎被删除了,甚至内存泄漏也不再出现了(我不知道为什么上次会出现)......
只要指针被正确删除,所有选项似乎都很好。
而它似乎被删除了,甚至内存泄漏也不再出现(谁知道为什么上次会出现)......
从外面看,它看起来很酷--该物体会自己崩溃。
这并不酷--当你离开时,你 "杀死 "了所有人...
这段代码更酷一些(崩溃了数组中的所有东西)。
但最酷的部分是当数组被内置到一个子类中时...
多态性问题。
文档 中有一个这样的例子。
CShape[10] shapes; // массив объектов CShape
//... здесь заполняем массив производными объектами
for (int i=0; i<10;i++)
{
//--- тип и площадь фигуры
Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
};
不太清楚应该怎么做
//... здесь заполняем массив производными объектами
我可以至少有一个例子吗?
还有,为什么数组的大小是为变量类型而不是为变量本身指定的?
此外,在文档的同一章中,声明类似乎也有错误。
class CShape{};
class CCircle{} : public CShape
class CSquare{} : public CShape
还有,为什么数组的维度是由变量类型指定的,而不是由变量本身指定的?
这纯粹是一个打字错误。
此外,在同一个文档章节 中,类的声明似乎也有错误。
class CShape{};
class CCircle{} : public CShape
class CSquare{} : public CShape
你指的是被声明的类的名字后面的大括号吗?
关于多态性的问题。
文档 中有一个这样的例子。
CShape[10] shapes; // массив объектов CShape
//... здесь заполняем массив производными объектами
for (int i=0; i<10;i++)
{
//--- тип и площадь фигуры
Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
};
我不太清楚应该怎么做。
//... здесь заполняем массив производными объектами
我可以至少有一个例子吗?
在你的文档中的例子之前,有这样一句话:"现在我们可以声明一个Shape类型的数组,用派生类的对象填充它。所以shapes[10]数组应该被填充为从CShape 派生的类的实例。对吗?
在同一个文档中,有两个派生类的例子:CCircle和CSquare。 因此,我们仍然要创建这两个类的实例,比如说。
...并用它们填充我们数组shapes[10]的前两个元素。
你同意吗?
在你的文档中的例子之前,有这样一句话:"现在我们可以声明一个Shape类型的数组,用派生类的 对象填充它"。因此,数组shapes[10]应该被填充为从CShape 派生的类的实例。对吗?
在同一个文档中,有两个派生类的例子:CCircle和CSquare。 因此,我们仍然要创建这两个类的实例,比如说。
...并用它们填充我们数组shapes[10]的前两个元素。
你同意吗?
我可能同意,但编译器会产生一个错误。
'shape' - 结构有对象,不能被复制 test.mq5 36 3
我可能会同意,但编译器会产生一个错误。
'shape' - 结构有对象,不能被复制 test.mq5 36 3
你能引用完整的代码吗?
当然。
//+------------------------------------------------------------------+
//| test.mq5 |
//| Ya |
//| Ya |
//+------------------------------------------------------------------+
#property copyright "Ya"
#property link "Ya"
#property version "1.00"
#property indicator_chart_window
//--- Базовый класс
class CShape
{
protected:
int m_type; // тип фигуры
int m_xpos; // X - координата точки привязки
int m_ypos; // Y - координата точки привязки
public:
void CShape(){m_type=0;}; // конструктор, тип равен нулю
int GetType(){return(m_type);};// возвращает тип фигуры
virtual
double GetArea(){return (0); }// возвращает площадь фигуры
};
//--- производный класс Круг
class CCircle: public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_radius; // радиус круга
public:
void CCircle(){m_type=1; m_radius=10;}; // конструктор, тип равен 1
void SetRadius(double r){m_radius=r;};
double GetArea(){return (3.14*m_radius*m_radius);}// площадь круга
};
//--- производный класс Квадрат
class CSquare: public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_square_side; // сторона квадрата
public:
void CSquare(){m_type=2;}; // конструктор, тип равен 2
void SetSide(double s){m_square_side=s;};
virtual double GetArea(){return (m_square_side*m_square_side);}//площадь квадрата
};
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
CShape shape[10]; // массив объектов CShape
//... здесь заполняем массив производными объектами
CCircle circle;
shape[1]=circle;
Print("Объект типа "+shape[1].GetType()+" имеет площадь "+ shape[1].GetArea());
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+