将C ++程序程序转换为面向对象

时间:2016-12-31 14:14:55

标签: c++ oop object encapsulation

我被告知使用多态,封装和继承的原则将程序C++ program转换为面向对象的程序。

标准C ++程序接受来自用户的数据值和过滤值。然后,它使用简单的算法将这些值相乘,并将输出打印到屏幕。标准程序如下所示。

我已经开始决定使用“TheFilter'和数据'每个人都有自己的' enterdata()',' displaydata()'和构造函数成员函数。

我遇到的问题是部分criteria set," main()应该只创建第一个对象"。我很难理解这一点,因为我见过的所有OOP代码示例都在main()中生成对象。

我能想出来的唯一解决方案是创建一个第三类(FilteredData - 见下文),它将实例化其他类对象' OriginalData',' Filter&#39 ;和' FilteredData'在被实例化后。然而,这让我感到不安,因为它不会从封装的概念中消失,因为它会导致一个类具有其他类对象的成员?

如果有人对如何避免这种情况有任何建议,并且最好遵守封装原则,我将非常感激!

我讨厌承认失败,但我从未使用面向对象的方法进行编程,而且我只研究了几个月的C ++。请帮忙!

#include <iostream>
using namespace std;

class TheData 
{
public:
    TheData(double* = 0, unsigned long = 0, bool = false); //constructor function
    ~TheData();

    void EnterData(TheData& OriginalData);              
    void DisplayData(TheData OriginalData, TheData FilteredData) const;


private:
    double* Values;                     
    unsigned long Length;                       
    bool Valid;

}

class TheFilter
{
public:
    TheFilter(double* = 0, unsigned long = 0, bool = false); //constructor function
    ~TheFilter();

    void EnterData(TheData& OriginalData);              
    void DisplayData(TheData OriginalData, TheData FilteredData) const;
    int ApplyFilter();

private:
    double* Values;                     
    unsigned long Length;                       
    bool Valid;

}

class 
{
public:
    FilteredData();    // constructor function that somehow instantiates an object for the filter and the data???
    void DisplayData();
private:
    TheData data
    TheFilter filter
    double * filteredData
}


int main()
{
    FilteredData Object1;
}  

1 个答案:

答案 0 :(得分:0)

  

我遇到的问题是标准集的一部分,&#34; main()应该只创建第一个对象&#34;,我很难解决这个问题,因为所有OOP示例都是如此代码我见过在main()中生成对象。我能想出来的唯一解决方案就是创建一个第三类(FilteredData - 见下文),它将实例化其他类对象&#39; OriginalData&#39;,&#39; Filter&#39;和&#39; FilteredData&#39;在被实例化后。然而,这让我很困扰,因为它不会从封装的概念中消失,因为它会导致一个类成员是其他类对象?

您引用的标准可能存在问题,但不一定是您认为的原因。作为一般规则,构造函数不应该在初始化调用它的对象之外工作。如果main()在初始化之后无法在对象上调用至少一个方法,则需要构造函数展示其他行为(触发程序的主要工作),这是一种糟糕的形式。即使所需要的只是使用GUI框架以某种方式注册对象,构造函数也不应该负责执行。

另一方面,作为对象,指针或对象引用或对象容器的类成员本身没有任何错误。事实上,这种情况非常普遍,良好的形式往往需要它。它本身并不会破坏封装。实际上,它可以通过提供比其他方式更多的封装来做相反的事情。

总的来说,您已经得出了一个正确的结论,即您需要一个代表整个程序的类,main()除了实例化该类并将其设置为有效之外什么都不做。这是一种相当普遍的模式。但是,如果你提出的细节并不适合你,那么可能有充分的理由。我倾向于同意一个代表数据和过滤器组合的类 - 尽管它本身是完全合理的 - 似乎不是整个程序或其主窗口的正确表示,或者它是什么你实际需要的。