假设我有一个类,并且我希望另一个类或函数可以读取其成员。 (例如,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
// ...
}
答案 0 :(得分:2)
通常,您要避免这两种情况。如果另一个类(例如X类)需要读取B拥有或已知的某些事物的值,通常您会提供B的某个提供该值的成员函数,其名称为GetFoo
。例如,X中的某些函数XF将具有类型b
的对象B
。也许是通过引用传递的,或者X中的函数构造了它,无论如何。要从Foo
获取b
的值,XF将使用b.GetFoo()
。 GetFoo
函数如下所示:
class B
{
private:
Some declaration of Foo;
…
public:
TypeOfFoo GetFoo() { return Foo; }
};
这比向XF提供指向Foo
中的b
的指针要好,因为这意味着B类可以自由更改其管理Foo
的方式。 Foo
可以是动态分配的对象,其地址有时会更改,或者可以是计算的值而不是直接存储的值。而且,一旦让X具有指向Foo
的指针,那么B的实现就无法更改,因此Foo
是不同的类型,或者以其他方式进行不同的管理,除非X中的所有代码和{的其他用法{1}}发生了变化。通常,您要避免B外的任何类都了解B内部的信息。他们不应该知道B内部数据的类型或位置。
假设您已确定类X 必须必须具有某种访问Foo
的方式,然后让其具有指向Foo
const
的指针可能会更好而不是您建议的Foo
和map
版本。这会导致名称的运行时查找,如果在编译时知道这些名称,这将很浪费。即使如此,在提供指向string
的{{1}}指针之后,您仍需要仔细记录类的义务和行为。一旦const
对象允许某个其他类具有指向Foo
的指针,b
就不能让Foo
的地址改变,并且b
一定不能除非指向其Foo
的指针的持有者使用了它,否则将销毁它。这种类型的互锁关系很容易出错,应该避免。
坚持在X中给X一个b
函数,直到您非常有充分的理由要做一些不同的事情为止。如果需要从多个值中进行选择,则Foo
可以,其中GetFoo()
是整数或GetFoo(identifier)
,而identifier
在数组中查找对象
答案 1 :(得分:0)
我不确定我是否理解您的问题,但是我认为您想要做的是将一个类的实例传递给另一个类
class Player
{
public:
// your "variables"
int32_t Score() {.. }
};
class UI
{
public:
void ShowScores(const Player& player)
{
std::cout << player.Score();
}
};