基本上,我有一个班级" 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 ++程序员,这只是我第一堂课的开始。我想我之后的事情,我不明白,在某种程度上是吸收对不同类别对象中私人数据的访问。 = /答案 0 :(得分:2)
我建议拆分你的基本设计。 C++
中的类(以及面向对象的设计中的类)应该模拟一些真实世界的对象。为此,Drug
可以包含属性(名称,价格等),但Client
(取Drug
的人)属于 属性Drug
,不应包含在该类定义中。
同样地,Client
可能是一个人,它也可以具有特定的属性(姓名,年龄,性别等)。 Drug
可能会或可能不会参与的任何Client
都不是Client
的属性。
我会对此进行建模,以便Drug
和Client
是两个独立的不同类,其中一个属性不在另一个中。完成后,您可以使用单独的类来模拟Drug
和Client
之间的关系。
例如:
Prescription
对象可以关联一个Client
和多个Drug
对象,而另一个类可以反向处理关联(一个Drug
和所有关联的{{1对象)。
就像这是家庭作业一样,我不想实际给你代码来做这件事,但我想让你以正确的“面向对象”的方式思考。
如果你说的话,这个基本设计是强加给你的(一个非常不幸的情况,因为设计本身并不理想,数据太高耦合,实际上违背了一些体面的面向对象原则)。您只需为数据类型添加访问器(getter)函数即可。这与公开数据不同,因为您无法实际更改数据,但您可以将其用于显示输出等目的。
答案 1 :(得分:0)
我不一定看到具有ClientList的Drug的模型有问题,除了类名可能无法准确反映这些用于什么。 “药物”似乎不是药物本身,而是“药物可用性” - 库存多少,需要购买多少。客户可以是“PrescriptionForDrug”,这可能包括需要多少的计数。
然后在对象术语中,我不使客户列表成为DrugAvailability的公共成员。它应该保密,因为没有人应该关心DrugAvailability中列出的内容。您只想知道,需要多少以及有多少库存。你想尽可能地隐藏“它是如何完成的”。
例如,“tobuy”不需要是int成员。相反,它可以是成员函数ToBuy(),而不是跟踪int成员,当调用此函数时,它可以(私下)运行PrescriptionForDrug列表(即客户端列表)并计算需要多少个,并将其与股票进行比较。
因此,在这种情况下,DrugAvailability.Stock()将返回有多少库存,DrugAvailability.ToBuy()将返回需要多少,并且它将解释任何处方。您实际上并不需要知道DrugAvailability中列出了PrescriptionForDrug,因此您将该详细信息保密。
重要的是要想出正确的事物名称,找出你想要解决的问题。然后,隐藏细节,只展示外界真正需要了解的部分。