我正在学习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是应用程序主窗口的类,它与用户输入等交互。
我想要做:
问题是:我应该在哪里创建类,以使其他类可以使用Data类成员。我应该使用继承吗?
答案 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”分配的对象。