C++ 转换C++;面向对象程序设计

C++ 转换C++;面向对象程序设计,c++,oop,object,encapsulation,C++,Oop,Object,Encapsulation,我被告知使用多态性、封装和继承的原则将过程转换为面向对象的过程 标准C++程序接受用户的数据值和过滤值。然后,它使用简单的算法将这些值相乘,并将输出打印到屏幕上。标准程序如下所示 首先,我决定使用一个类作为“过滤器”和一个类作为“数据”,每个类都有自己的“enterdata()”、“displaydata()”和构造函数成员函数 我遇到的问题是“main()应该只创建第一个对象”的一部分。我很难理解这一点,因为我见过的所有OOP代码示例都在main()中生成对象 我目前唯一能想到的解决方案就是创

我被告知使用多态性、封装和继承的原则将过程转换为面向对象的过程

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

首先,我决定使用一个类作为“过滤器”和一个类作为“数据”,每个类都有自己的“enterdata()”、“displaydata()”和构造函数成员函数

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

我目前唯一能想到的解决方案就是创建一个第三类(Filteredata-见下文),它将在自身实例化时实例化其他类对象“OriginalData”、“Filter”和“Filteredata”。然而,这让我感到不安,因为它会导致一个包含其他类对象成员的类,所以不会取消封装的概念吗

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

我不愿意承认失败,但我从来没有用面向对象的方法编程过,我只学习了几个月的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;
}  
#包括
使用名称空间std;
分类数据
{
公众:
数据(double*=0,unsigned long=0,bool=false);//构造函数
~TheData();
作废输入数据(数据和原始数据);
无效显示数据(数据原始数据、数据过滤器数据)常量;
私人:
双*值;
无符号长长度;
布尔有效;
}
分级过滤器
{
公众:
过滤器(double*=0,unsigned long=0,bool=false);//构造函数
~TheFilter();
作废输入数据(数据和原始数据);
无效显示数据(数据原始数据、数据过滤器数据)常量;
int ApplyFilter();
私人:
双*值;
无符号长长度;
布尔有效;
}
班
{
公众:
FilteredData();//以某种方式实例化筛选器和数据对象的构造函数???
void DisplayData();
私人:
数据
过滤器
双*过滤器数据
}
int main()
{
过滤数据对象1;
}  
我遇到的问题是标准集的一部分,“main()应该只创建第一个对象”,我很难理解这一点,因为我见过的所有OOP代码示例都在main()中生成对象。我目前唯一能想到的解决方案就是创建一个第三类(Filteredata-见下文),它将在自身实例化时实例化其他类对象“OriginalData”、“Filter”和“Filteredata”。然而,这让我感到不安,因为它会导致一个包含其他类对象成员的类,所以不会取消封装的概念吗

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

另一方面,作为对象、对象的指针或引用或对象的容器的类成员本质上没有任何错误。事实上,这是非常普遍的,良好的形式往往需要它。它本身并不影响封装。事实上,通过提供比其他方式更多的封装,它可以实现相反的效果


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

您好,欢迎光临。请拿着这本书读一读。这是一个很好的列表。约翰,谢谢你的回复!如果我放弃第三个类的想法,如果我在“TheFilter”类中包含一个成员函数,该类从“TheData”类创建了两个对象,它会遵守封装和标准形式吗@伊尔霍克,你好像误解了我。我并不是建议你一般放弃三等舱的想法。我建议你改变你对这个类所代表的概念。