关于OOP(面向对象的编程)的问题 - 页 3

 
tara:

加。

补充说))。
 
EverAlex:

对于圆来说,它是以一种方式计算的,对于正方形来说则是另一种方式。但无论哪种情况--通过调用 Figura.GetSquare()

例如,我发现学习理论,演示一个例子,并描述函数如何定义一个圆、正方形、梯形或三角形是很难的。
 
和沉默......。
 
VOLDEMAR:
和沉默......。

嗯,这是一个2x2=?

没有兴趣回答。

=================

也许这更接近。

类中有一套标准的虚拟方法:Open(), Close(), Read(), Write()等。

这样的类可以处理文件、映射、通道、互联网等。

只有这些方法的内容(描述)会有所不同。但类的接口将是相同的。

 

你不觉得这很可疑吗,这已经是关于这个问题的第三页了,却没有人举出一个代码点作为例子?

此外,回答这个问题并不有趣,它很初级,简单到懒得编码......

如果有人知道什么,我想他们会回答......

 

VOLDEMAR,如果你把你的第一个帖子,为什么那里会有一个类?编写类是程序复杂性的结果,当单个元素有许多外部链接时,就会创建一个类来统一所有这些元素并创建一个简单的接口。在我看来,一个类的必要属性是数据(int's, double's ...)--函数工作的材料,这个类将所有的东西连接在一个包里(数据和函数)。我认为这是OOP的基本思想。例如,两个例子,第一个没有OOP,第二个有OOP。

void sum(int &i1, int &i2, int val)
{
    i1 += val;
    i2 += val;
}
int get_number(int &i1, int &i2)
{
    return i1 + i2;
}
void main()  // главная функция программы
{
    int i1, i2;
    sum(i1, i2, 56);
    any_fn(get_number(i1, i2));   // какое-то действие с нашей суммой.
}
class QQ
{
    int i1;
    int i2;
public:
    void sum(int val)
    {
        this->i1 += val;
        this->i2 += val;
    }
    int get_number()
    {
        return this->i1 + this->i2;
    }
};

void main()  // главная функция программы
{
    QQ q;
    q.sum(56);
    any_fn(q.get_number());   // какое-то действие с нашей суммой.
}

在第二个例子中,我们不必担心函数将与之工作的数据,我认为这是OOP的主要目的。

 
为什么第二个方法会出现一堆错误和警告呢?
 

关于你的代码还有一句话。

...
class vr_trade
  {
   ...
                    ~vr_trade(){}
  };
...

我有一个规则:永远不要把析构器写成空的。没有析构器是类的简单性指标。如果写了一个析构器,你可能要写一个拷贝构造器和=操作符,或者禁止它们。例子。

struct S {};
class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
};
void main()
{
    QQ q;
    QQ q2 = q;
}

这将导致delete对同一个指针被调用两次。正确的方法是这样的

class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
    QQ(QQ &);            // Только объявляем, определения нигде нет.
    QQ &operator=(QQ &); // Только объявляем, определения нигде нет.
};

//или
class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
    QQ(QQ &q)               {this->p = new S(*q.p);}
    QQ &operator=(QQ &q)    {*this->p = *q.p;}
};

所以,如果你必须写一个析构器,这是个很好的理由,要三思而后行--如何处理歌剧=和复制构造器?删除它,写它......?我认为你不应该把析构器写成空的,它的缺失说明你不需要重做上述工作。

 
VOLDEMAR:
为什么第二个方法会抛出一堆错误和警告呢?

在这后面加一个点,而不是->。 mql芯片。
 

请解释这些行动

struct complex
  {
   double            re; // действительная часть
   double            im; // мнимая часть
   //--- конструкторы
                     complex():re(0.0),im(0.0) {  }
                     complex(const double r):re(r),im(0.0) {  }
                     complex(const double r,const double i):re(r),im(i) {  }
                     complex(const complex &o):re(o.re),im(o.im) { }
   //--- арифметические операции
   complex           Add(const complex &l,const complex &r) const;  // сложение
   complex           Sub(const complex &l,const complex &r) const;  // вычитание
   complex           Mul(const complex &l,const complex &r) const;  // умножение
   complex           Div(const complex &l,const complex &r) const;  // деление
  };

就是说

                     complex():re(0.0),im(0.0) {  }
                     complex(const double r):re(r),im(0.0) {  }
                     complex(const double r,const double i):re(r),im(i) {  }
                     complex(const complex &o):re(o.re),im(o.im) { }

为什么要用符号(:),我们能得到什么?