我很难在C ++类中实现我想要的数据访问

时间:2012-01-04 19:47:32

标签: c++ private-members

基本上,我有一个班级" A"与各种私人数据。 Class" B"是指向" A"对象。 Class" C"有其他(对于我的查询而言不是必不可少的)数据,还有一个对象" B",换言之,有一个A列表。我应该用这种类嵌套为学校做一个简单的C ++项目。我想我可以修复"一切都是通过公开所有数据,但这是残暴的。

drug.h

#ifndef DRUG_H
#define DRUG_H
#include "clientlist.h"

// forward declaration
class ClientList;

class Drug {

    private:

    ClientList clients;

    std::string name;
    std::string description;
    double price;
    int stock;
    int tobuy;

    public:

    Drug(std::string n = "drug", std::string d = "description", double p = 0.0, int s = 0, int b = 0);

    void print();
};

#endif

drug.cpp

#include <iostream>
#include <string>
#include <iomanip>
#include "drug.h"
using namespace std;

Drug::Drug(string n, string d, double p, int s, int b) {
    name = n;
    description = d;
    price = p;
    stock = s;
    tobuy = b;
}

void Drug::print() {
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout << setprecision(2);
    cout << "price is: " << price << " PLN" << endl;
    cout << "stock is: " << stock << endl;
    cout << "tobuy is: " << tobuy << endl;
    cout << "name is: " << name << endl;
    cout << "description is: " << description << endl;
}

clientlist.h

#ifndef CLIENT_LIST_H
#define CLIENT_LIST_H

//forward declaration
class Client;

class ClientList {

    private:

    struct clientlistelement {
    Client *data;
    clientlistelement *next;
    };

    clientlistelement *head;

    int numberofclients;

    public:

    ClientList();
    void print();
};

#endif

的main.cpp

#include <iostream>
#include <string>
#include "drug.h"
#include "druglist.h"
#include "client.h"
#include "clientlist.h"
using namespace std;

int main() {

    Drug d;
    Client c;

    d.print();
    cout << d.clients.numberofclients << endl; // <-- error

    cout << endl;

    c.print();

    return 0;
}

也许我的设计很糟糕,但基本上药物的设计目的是包含一个&#34;列表&#34;对象,它本质上只是一个指向客户端对象的指针列表,而这些对象又包含药物列表。这种双向镜像交互的全部意义在于,可以单独链接两种类型的对象列表,这些对象是相互&#34;分配的&#34; (阅读:指向)彼此,模拟了解客户的服务,反之亦然。但是,我很快就偶然发现了几乎无法访问任何数据的问题。我尝试与我的印刷会员建立联系无济于事,我不确定从哪里开始。任何人都可以提出一些想法吗?

编辑:我不是一个经验丰富或优秀的C ++程序员,这只是我第一堂课的开始。我想我之后的事情,我不明白,在某种程度上是吸收对不同类别对象中私人数据的访问。 = /

2 个答案:

答案 0 :(得分:2)

我建议拆分你的基本设计。 C++中的类(以及面向对象的设计中的类)应该模拟一些真实世界的对象。为此,Drug可以包含属性(名称,价格等),但Client(取Drug的人)属于 属性Drug,不应包含在该类定义中。

同样地,Client可能是一个人,它也可以具有特定的属性(姓名,年龄,性别等)。 Drug可能会或可能不会参与的任何Client都不是Client的属性。

我会对此进行建模,以便DrugClient是两个独立的不同类,其中一个属性不在另一个中。完成后,您可以使用单独的类来模拟DrugClient之间的关系。

例如:

Prescription对象可以关联一个Client和多个Drug对象,而另一个类可以反向处理关联(一个Drug和所有关联的{{1对象)。

就像这是家庭作业一样,我不想实际给你代码来做这件事,但我想让你以正确的“面向对象”的方式思考。

如果你说的话,这个基本设计是强加给你的(一个非常不幸的情况,因为设计本身并不理想,数据太高耦合,实际上违背了一些体面的面向对象原则)。您只需为数据类型添加访问器(getter)函数即可。这与公开数据不同,因为您无法实际更改数据,但您可以将其用于显示输出等目的。

答案 1 :(得分:0)

我不一定看到具有ClientList的Drug的模型有问题,除了类名可能无法准确反映这些用于什么。 “药物”似乎不是药物本身,而是“药物可用性” - 库存多少,需要购买多少。客户可以是“PrescriptionForDrug”,这可能包括需要多少的计数。

然后在对象术语中,我使客户列表成为DrugAvailability的公共成员。它应该保密,因为没有人应该关心DrugAvailability中列出的内容。您只想知道,需要多少以及有多少库存。你想尽可能地隐藏“它是如何完成的”。

例如,“tobuy”不需要是int成员。相反,它可以是成员函数ToBuy(),而不是跟踪int成员,当调用此函数时,它可以(私下)运行PrescriptionForDrug列表(即客户端列表)并计算需要多少个,并将其与股票进行比较。

因此,在这种情况下,DrugAvailability.Stock()将返回有多少库存,DrugAvailability.ToBuy()将返回需要多少,并且它将解释任何处方。您实际上并不需要知道DrugAvailability中列出了PrescriptionForDrug,因此您将该详细信息保密。

重要的是要想出正确的事物名称,找出你想要解决的问题。然后,隐藏细节,只展示外界真正需要了解的部分。