什么是更好的做法?通过指针或标识符传递类成员?
What is better practice? Pass class member by pointer or identifier?
假设我有一个类,我希望另一个类或函数读取其成员。(例如,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
,那么让它有一个指向const
Foo
的指针可能比你提出的map
和string
版本更好。这会导致名称的运行时查找,如果在编译时知道名称,这只会浪费。即便如此,通过提供Foo
的const
指针,您需要仔细记录类的义务和行为。一旦一个b
对象允许其他类有一个指向Foo
的指针,b
就不能让Foo
的地址改变,并且除非指向其Foo
的指针的持有者使用它,否则b
不能被销毁。这些连锁关系容易出错,应避免。
坚持在 B 中给 X 一个GetFoo()
函数,直到你有充分的理由做一些不同的事情。如果需要从多个值中进行选择以获取,则可以GetFoo(identifier)
,其中identifier
是整数或enum
,GetFoo
在数组中查找对象。
我不确定我是否理解您的问题,但我认为您要做的是将一个类的实例传递给另一个类
class Player
{
public:
// your "variables"
int32_t Score() {.. }
};
class UI
{
public:
void ShowScores(const Player& player)
{
std::cout << player.Score();
}
};
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 什么是更好的做法?通过指针或标识符传递类成员?
- 从子类访问模板类成员时出现"找不到标识符"错误
- 声明与 const 变量和成员函数相同的标识符
- 当枚举器列表项的标识符已是结构的成员时,如何使用枚举器列表项
- 没有成员作为唯一标识符的两个类实例的比较
- c++类成员与成员函数参数相同的标识符
- 是否可以仅通过标识符检查成员模板的存在
- Shared_ptr对抽象基类(成员变量)是一个未声明的标识符
- 链接器2001错误和未定义的成员变量标识符
- 尝试从另一个.cpp启动TShape时,成员标识符应出现错误