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

时间:2018-10-06 17:29:42

标签: c++

假设我有一个类,并且我希望另一个类或函数可以读取其成员。 (例如,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
    // ...
}

2 个答案:

答案 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的指针可能会更好而不是您建议的Foomap版本。这会导致名称的运行时查找,如果在编译时知道这些名称,这将很浪费。即使如此,在提供指向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(); 
  }

};