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()); };
무엇이 제자리에 있어야 하는지 잘 이해가 되지 않습니다.
//... здесь заполняем массив производными объектами
최소한 1개의 예를 들어주실 수 있습니까?
문서에서 인용한 예 이전에 "이제 Shape 유형의 배열을 선언하고 파생 클래스의 개체로 채울 수 있습니다."라는 문구가 있습니다. 따라서 shape[10] 배열은 CShape에서 파생된 클래스의 인스턴스로 채워져야 합니다. 바르게?
동일한 문서에는 파생 클래스의 두 가지 예인 CCircle 및 CSquare가 있습니다. 따라서 다음과 같이 이 두 클래스의 인스턴스를 생성해야 합니다.
//+------------------------------------------------------------------+ //| 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) 이 모든 자식의 포인터를 삭제하기에 충분하다고 가정하더라도 사용할 이유가 없습니다.
글쎄, 그것은 또 다른 질문입니다 :) - 편의의 문제입니다. 나는 또한 이 접근 방식의 정확성/문해력에 대한 질문에 관심이 있습니다.
예, 포인터가 올바르게 삭제되면 모든 변형이 좋습니다.
그리고 메모리 누수 현상이 없어져도 제거된 것 같습니다(FIG는 지난번에 왜 나왔는지 압니다)...
예, 포인터가 올바르게 제거되면 모든 변형이 좋습니다.
그리고 메모리 누수 현상이 없어져도 제거된 것 같습니다(FIG는 지난번에 왜 나왔는지 압니다)...
측면에서 보면 멋져 보입니다. 물체가 스스로를 강타합니다.
멋진 것은 없습니다 - 모두를 "소화"하고 ...
이 코드는 조금 더 시원합니다(어레이의 모든 것이 충돌함).
그러나 가장 멋진 점은 배열이 자손 클래스에 포함되어 있는 경우입니다...
다형성 질문입니다.
설명서 에는 다음 예가 있습니다.
CShape[ 10 ] shapes; // массив объектов CShape
//... здесь заполняем массив производными объектами
for ( int i= 0 ; i< 10 ;i++)
{
//--- тип и площадь фигуры
Print ( "Объект типа " +shapes[i].GetType()+ " имеет площадь " + shapes[i].GetArea());
};
무엇이 제자리에 있어야 하는지 잘 이해가 되지 않습니다.
//... здесь заполняем массив производными объектами
최소한 1개의 예를 들어주실 수 있습니까?
그리고 배열의 차원이 변수 자체가 아니라 변수의 유형으로 표시되는 이유는 무엇입니까?
또한 문서의 같은 장 에서 클래스 선언에 오류가 있는 것 같습니다.
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());
};
무엇이 제자리에 있어야 하는지 잘 이해가 되지 않습니다.
//... здесь заполняем массив производными объектами
최소한 1개의 예를 들어주실 수 있습니까?
문서에서 인용한 예 이전에 "이제 Shape 유형의 배열을 선언하고 파생 클래스의 개체로 채울 수 있습니다."라는 문구가 있습니다. 따라서 shape[10] 배열은 CShape에서 파생된 클래스의 인스턴스로 채워져야 합니다. 바르게?
동일한 문서에는 파생 클래스의 두 가지 예인 CCircle 및 CSquare가 있습니다. 따라서 다음과 같이 이 두 클래스의 인스턴스를 생성해야 합니다.
...그리고 shape[10] 배열의 처음 두 요소를 다음과 같이 채웁니다.
동의하십니까?
문서에서 인용한 예제 이전에 "이제 Shape 유형의 배열을 선언하고 이를 파생 클래스의 개체로 채울 수 있습니다."라는 문구가 있습니다. 따라서 shape[10] 배열은 CShape에서 파생된 클래스의 인스턴스로 채워져야 합니다. 바르게?
동일한 문서에는 파생 클래스의 두 가지 예인 CCircle 및 CSquare가 있습니다. 따라서 다음과 같이 이 두 클래스의 인스턴스를 생성해야 합니다.
...그리고 shape[10] 배열의 처음 두 요소를 다음과 같이 채웁니다.
동의하십니까?
동의할 수 있지만 컴파일러에서 오류가 발생합니다.
'모양' - 구조에 개체가 있고 복사할 수 없습니다. test.mq5 36 3
동의할 수 있지만 컴파일러에서 오류가 발생합니다.
'모양' - 구조에 개체가 있고 복사할 수 없습니다. 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);
}
//+------------------------------------------------------------------+