如何在类之间交换数据?

7

我正在学习C++并将我的项目从C移植到C++。在这个过程中,我遇到了一个问题:如何保存/更新在多个类中使用的变量?在C中,我使用全局变量,但这对于C++不好。

因此,假设我们有4个类:

class Main_Window
{
    //...
    void load_data_menu_selected();
}

class Data
{
    //...
    double *data;
}

class Load_Data
{
    //...
    double *get_filename_and_load();
}

class Calculate
{
    //...
    int do_calculation()
}

所以,Main_Window是应用程序主窗口的类,它与用户输入等进行交互。
我想做的是:
  • 在Main_Window中创建Data类的实例
  • 使用Load_Data从文件中加载数据并将其存储在Data类中
  • 使用Calculation类对Data类中读取的数据进行处理
  • 问题是:我应该在哪里创建这些类,以使Data类成员可以从其他类中访问。我应该使用继承吗?

    这是关于类的一些通用信息:http://cplusplus.com/doc/tutorial/classes/ - RvdK
    获取和设置方法,但我建议在这里需要重新考虑代码设计。 - ewanm89
    2
    类名如Load_DataCalculate非常可疑。类是名词,不是动词。你可能需要一个DataLoader,但很有可能你不需要那么复杂的东西——大部分时间你只需要Data构造函数,而几乎所有其余时间都只需要在文件范围内使用一个自由函数load_from_filename即可。 - Karl Knechtel
    5个回答

    2

    从观察两个类的实例之间可能存在的关系开始。假设a是类A的一个实例,b是类B的一个实例。如果a使用b,则类A可以将类B的实例(b)、指向b的指针(类型为B*)或b的引用(类型为B&)作为其成员。如果只有类A的一个方法使用b,那么你仍然有同样的三个选项:BB*B&可以作为该方法的参数。将B*B&作为类成员表明a不控制b的生命周期,因此类A必须有一种方法通过其参数来设置这些成员。所有权(对象的生命周期)的问题在类之间的关系设计中起着重要作用。主要关系在本文中简要介绍


    1

    我认为你只需要一个Main_Window类,其余的应该是该类的成员。

    class Main_Window
    {
     private:
     DataObject windowData;
    
     public:
     void loadData(string fileName);
     void calculate();
    }
    

    在loadData和calculate方法中,您将能够使用this->windowData访问相同的数据。如果我的语法不好,请见谅,我的C++有点生疏。

    我考虑过,但是所有这些类都很大,有许多方法。合并它们不是很方便... - Daniel Uspensky
    我认为合并永远不是一个好主意。然而,我非常确定“Load_Data”和“Calculate”不应该成为类。当然你可以这样做,但你也可以把所有的整数和浮点数存储为字符串。这可能不是最好的想法。 - Matt

    1
    通常情况下,您会将(const)Data&作为参数传递。如果do_calculation()需要使用Data进行计算,则它会采用Data&。但是,除非您发布更多的设计内容,否则我无法提供更具体或有用的建议。

    0

    你需要知道如何进行面向对象的设计。在C语言中思考与在C++中思考是不同的,你可以让你的类有很多方法,但这听起来像是一个糟糕的设计。

    我建议你从SOLID原则开始学习。然后为你的类编写单元测试。TDD可以帮助你进一步改善你的设计。


    0

    听起来你在这里不应该使用继承。说出这样的原因是你有许多类(Window、Calculator等)正在使用或对实体(即Data)进行某些操作。继承用于表示“是一个”关系(即如果A从B继承,A“是一个”B)。

    在这种情况下,你应该使用组合,它表示“有一个”关系。因此,每个类都会引用Data的一个实例,并对该对象进行操作。

    谁拥有Data对象?要共享单个Data对象,你可以查看Boost shared_ptr,它允许多个引用计数指针共享使用“new”分配的对象。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接