如何在类之间交换数据?

时间:2010-12-20 10:24:47

标签: c++

我正在学习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类成员。我应该使用继承吗?

    5 个答案:

    答案 0 :(得分:2)

    从观察两个类的实例之间可能的关系开始。我们说 a 是A类的实例, b 是B类的实例。如果 a 使用 b ,A类可以作为B类的成员实例( b ),指向 b 的指针(其类型为 B * ),或 b 的参考( B& 类型)。如果只有一种A类方法使用 b ,则又有三种选择: B B * B& 可以是方法的参数。将 B * B& 作为班级成员表示 a 不会控制 b 的生命周期,因此A级必须有一个方法,通过其参数设置这些成员。所有权问题(对象的生命周期)在类之间的关系设计中起着重要作用。主要关系简要描述in this article

    答案 1 :(得分:1)

    我认为你只想拥有一个Main_Window类,其余的应该是该类的成员。

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

    在loadData和calculate方法中,您将能够使用this->windowData访问相同的数据。对不起,如果我的语法不好,我的c ++就生锈了

    答案 2 :(得分:1)

    通常,你会传递(const)数据&作为一个论点。如果do_calculation()需要使用Data,那么它需要Data&。但除非你发布更多的设计,否则我不能更具体或更有用。

    答案 3 :(得分:0)

    您需要知道如何在OO中进行设计。用C语言思考不同于用c ++思考。你可以认为你的课有很多方法。嗯,这听起来像是一个糟糕的设计。

    我建议您从SOLID principle开始。 然后开始为您的课程编写单元测试。 TDD可以帮助您进一步改进设计。

    答案 4 :(得分:0)

    听起来你不应该在这里使用继承。这样说的主要原因是你有许多类(窗口,计算器等)使用或对实体做某事(即数据)。继承用于表示“是一种”关系(即如果A继承自B,A“是”B“。

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

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