gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:41 26 4
gpt4 key购买 nike

基本上,我有一个包含各种私有(private)数据的“A”类。 “B”类是指向“A”对象的指针的单链表。 “C”类有其他(对于我的查询而言不是必需的)数据和一个对象“B”,换句话说,一个 A 列表。我应该用这种类嵌套为学校做一个简单的 C++ 项目。我想我可以通过公开所有数据来“修复”所有问题,但这太糟糕了。

药物.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

药物.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;
}

客户端列表.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

主要.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;
}

也许我的设计很糟糕,但基本上药物被设计为包含一个“列表”对象,它本质上只是指向客户端对象的指针列表,而客户端对象又包含药物列表。这种双向镜像交互的全部意义在于拥有两种类型的对象的单链表,它们相互“分配”(读作:指向)彼此,以模拟了解其客户的服务,反之亦然。但是我很快就偶然发现了几乎无法访问任何数据的问题。我尝试与我的打印成员(member)交友但无济于事,而且我不确定该从哪里开始。任何人都可以提供一些想法吗?

编辑:我绝不是一个经验丰富或优秀的 C++ 程序员,这只是我第一个类的开始。我想我所追求的,但我不明白,是以某种方式吸收对不同类对象中私有(private)数据的访问。 =/

最佳答案

我建议拆分您的基本设计。 C++(以及一般的面向对象设计)中的类应该模拟一些真实世界的对象。为此,Drug 可以具有属性(名称、价格等),但是Client(服用Drug 的人)是< em>不是 Drug 的属性,不应包含在该类定义中。

同样,Client 大概是一个人,同样可以具有特定的属性(姓名、年龄、性别等)。 Client 服用或不服用的任何 Drug 都不是该 Client 的真正属性。

我会对此建模,以便 DrugClient 是两个独立的不同类,彼此之间没有任何属性。完成后,您可以使用单独的类来模拟 DrugClient 之间的关系。

例如:

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

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

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

关于c++ - 我很难在 C++ 类中实现我想要的那种数据访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8733024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com