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());
};
何がどうあるべきなのかよくわからない
//... здесь заполняем массив производными объектами
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型の配列を宣言し、派生クラスのオブジェクトで埋めることができます」というフレーズがあります。したがって、shapes[10]配列はCShapeから 派生したクラスのインスタンスで埋め尽くされる必要があります。そうだろ?
派生クラスの例として、CCircleとCSquareの2つが同じ文書に記載されています。 ですから、例えば、この2つのクラスのインスタンスを作成することが残されているのです。
...を作成し、配列shapes[10]の最初の2つの要素をそれらで埋めます。
あなたはそう思いますか?
ドキュメントの例の前に、「これでShape型の配列を宣言し、派生クラスの オブジェクトで埋めることができます」というフレーズがあります。したがって、配列shapes[10]には、CShapeから 派生したクラスのインスタンスを格納する必要があります。そうだろ?
派生クラスの例として、CCircleとCSquareの2つが同じ文書に記載されています。 ですから、例えば、この2つのクラスのインスタンスを作成することが残されているのです。
...を作成し、配列shapes[10]の最初の2つの要素をそれらで埋めます。
あなたはそう思いますか?
同意しても、コンパイラはエラーを発生させる。
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);
}
//+------------------------------------------------------------------+