什么是更好的做法?通过指针或标识符传递类成员?

What is better practice? Pass class member by pointer or identifier?

本文关键字:标识符 成员 指针 更好 什么      更新时间:2023-10-16

假设我有一个类,我希望另一个类或函数读取其成员。(例如,UI 读取玩家的分数和其他内容。

假设我在很长一段时间内经常发生这种情况,有许多不同的变量。

我,A,是否通过指针将其传递给另一个类,以便它可以从内存中读取...

class VariableReader {
public:
int* read;
void GiveYourVariableToMe(int* var) {
read = var; // keep accessing the variable with this "read" member
};
};

或者我,B 创建一个对象数组和一个对象标识符供其使用

std::map<std::string, int> VariablesToRead;
class VariableReader {
public:
std::string identity;
void GiveYourVariableToMe(std::string Identifier) {
VariablesToRead[identity]; // keep accessing this variable with the through the map
};
};

还是我应该做其他事情?

编辑:也许我解释得不够好。

我说的是如果我有一个包含一堆成员变量的类,并且我希望它读取的变量是特定于对象的,例如:

class Player {
public:
int var1;
int var2;
int var3;
int var4;
int var5;
int var6;
int var7;
};

我创建,假设一堆文本对象,更新时显示分配给它们的变量

void Game() {
TextObject obj1; // displays var1 when updated
TextObject obj2; // displays var2 when updated
TextObject obj3; // displays var3 when updated
TextObject obj4; // displays var4 when updated
TextObject obj5; // displays var5 when updated
// ...
}

通常,您希望避免其中任何一个。如果另一个类,例如某个类 X,需要读取类 B 拥有或已知的某个事物的值,通常您提供 B 的某个成员函数来提供该值,其名称如GetFoo。例如,X 中的某些函数 XF 将具有B类型的对象b。也许它是通过引用传递的,或者 X 中的函数构造了它,等等。为了从b中获取Foo的值,XF将使用b.GetFoo()GetFoo函数如下所示:

class B
{
private:
Some declaration of Foo;
…
public:
TypeOfFoo GetFoo() { return Foo; }
};

这比在b中为 XF 提供一些指向Foo的指针更可取,因为这意味着 B 类可以自由更改它管理Foo的方式。Foo可以是地址有时会更改的动态分配对象,也可以是计算而不是直接存储的值。而且,一旦你让 X 有一个指向Foo的指针,那么 B 的实现就不能改变,因此Foo是一种不同的类型,或者以不同的方式管理,除非 X 中的所有代码和Foo的其他用法都发生了变化。通常,您希望避免 B 外部的任何类具有有关 B 内部内容的大量信息。他们不应该知道 B 内部数据的类型或位置。

假设你已经决定类X必须有某种方式访问Foo,那么让它有一个指向constFoo的指针可能比你提出的mapstring版本更好。这会导致名称的运行时查找,如果在编译时知道名称,这只会浪费。即便如此,通过提供Fooconst指针,您需要仔细记录类的义务和行为。一旦一个b对象允许其他类有一个指向Foo的指针,b就不能让Foo的地址改变,并且除非指向其Foo的指针的持有者使用它,否则b不能被销毁。这些连锁关系容易出错,应避免。

坚持在 B 中给 X 一个GetFoo()函数,直到你有充分的理由做一些不同的事情。如果需要从多个值中进行选择以获取,则可以GetFoo(identifier),其中identifier是整数或enumGetFoo在数组中查找对象。

我不确定我是否理解您的问题,但我认为您要做的是将一个类的实例传递给另一个类

class Player
{
public:
// your "variables"
int32_t Score() {.. }
};
class UI
{
public:
void ShowScores(const Player& player)
{
std::cout << player.Score(); 
}
};