【问题标题】:Converting C++ Procedural Program Into Object Oriented将 C++ 过程程序转换为面向对象
【发布时间】:2016-12-31 14:14:55
【问题描述】:

有人告诉我,使用多态性、封装和继承的原则将过程式C++ program 转换为面向对象的。

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

我首先决定使用一个用于“TheFilter”的类和一个用于“TheData”的类,每个类都有自己的“enterdata()”、“displaydata()”和构造函数成员函数。

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

我能想出的唯一当前解决方案是创建一个第三类(FilteredData - 见下文),它会在实例化自身时实例化其他类对象“OriginalData”、“Filter”和“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;
}  

【问题讨论】:

标签: c++ oop object encapsulation


【解决方案1】:

我遇到的问题是部分标准集,“main() 应该只创建第一个对象”,作为我见过的所有 OOP 代码示例,我很难理解这一点在 main() 中生成对象。我能想出的唯一当前解决方案是创建一个第三类(FilteredData - 见下文),它将在实例化自身时实例化其他类对象“OriginalData”、“Filter”和“FilteredData”。然而,这让我很困扰,因为它不会脱离封装的概念,因为它会导致一个类的成员是其他类对象?

您引用的标准可能存在问题,但不一定出于您认为的原因。作为一般规则,除了初始化调用它的对象之外,构造函数不应该做任何工作。如果main() 在初始化后不能调用对象上的至少一个方法,那么这需要构造函数表现出额外的行为(触发程序的主要工作),这是一种糟糕的形式。即使只需要通过 GUI 框架以某种方式注册对象,这仍然是构造函数不应该负责执行的工作。

另一方面,作为对象、对象的指针或引用或对象容器的类成员在本质上没有任何问题。这实际上非常普遍,而且良好的形式通常需要它。它本身并不损害封装。事实上,它可以通过提供比其他方式更多的封装来做相反的事情。

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

【讨论】:

  • 约翰,谢谢您的回复!如果我要放弃第三类的想法,如果我要在“TheFilter”类中包含一个从“TheData”类创建2个对象的成员函数,它会遵守封装和标准形式吗? Like This
  • @eelhonk,你似乎误解了我的意思。我一点也不建议你放弃一般的第三类的想法。我建议你改变你对该类代表的概念。
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多