【问题标题】:How to write a get function for a private char array in the class in both .h and .cpp?如何在 .h 和 .cpp 中为类中的私有 char 数组编写 get 函数?
【发布时间】:2019-07-11 03:51:46
【问题描述】:

如何为 .h 和 .cpp 中的类中的私有字符数组编写 get 函数?我不知道我是否应该使用 char* 来代替类型或其他东西。

我尝试过使用char[] getCharArray();,但似乎不可接受。

// in .h
class Foo{
private:
   char charArray[32];
public:
   char getCharArray(); // How to write the get function?
};


// in .cpp
char Foo::getCharArray(){
// How to write the get function in .cpp?
}

【问题讨论】:

  • 获取a couple of good books 阅读。他们应该告诉你所有你需要知道的以及更多。
  • 您希望 getter 函数返回数组的副本,还是提供对它的直接访问?如果直接访问,您希望该访问是只读的还是读写的?另外,这应该是一个字符串还是应该是一个 32 字节值的数组?
  • @NikosC。我希望 get 函数返回一个字符数组,因为我还将在类中包含一个 set 函数,我只希望访问是只读的。
  • @NikosC。它应该是一个具有 32 字节值的字符数组。我更喜欢使用字符串,因为这对我来说更容易也更熟悉,但这里需要字符数组。
  • 您不能在 C++ 中返回原始数组。考虑使用std::arraystd::vector

标签: c++ arrays class char


【解决方案1】:

使用std::array 并返回对它的const 引用。这提供了只读的直接访问:

#include <array>

class Foo {
public:
    const std::array<char, 32>& getCharArray() const
    {
        return charArray;
    }

private:
    std::array<char, 32> charArray{}; // The '{}' zero-initializes the array.
};

如果代码需要const char*指向数组的指针,请使用std::arraydata()成员函数:

void printFoo(const Foo& foo)
{
    printf("%s", foo.getCharArray().data());
}

【讨论】:

  • 返回对象内部状态的引用不是一个好习惯。
  • @Hoodi 这是const 参考。不能随意修改。
  • 是的,但也不推荐。阅读 Scott Mayer 的书,即 Effective C++ (item #28)
  • @Hoodi 那里提到的一切似乎都不适用于这里。 “调用者实际上可以修改这些句柄返回的点。”这里不是这种情况,因为我们返回一个const ref。 “如果你向调用者返回一个内部指针,它可能会比你的对象的寿命更长,并且指针将变成悬空指针”。这也不是这里的情况,因为我们没有返回一个指针。除此之外,OPs 问题中没有任何内容可以让我们判断是否建议公开charArray。我们实际上并不知道 Foo 应该是什么。
  • 这是本书的摘录:“这就是为什么任何返回对象内部句柄的函数都是危险的。句柄是指针还是引用都没有关系, 或迭代器。它是否用 const 限定无关紧要。返回句柄的成员函数本身是否为 const 无关紧要。重要的是正在返回一个句柄,因为一旦完成,你冒着句柄比它所指的对象寿命更长的风险。”
【解决方案2】:

由于上一个答案实际上并没有回答问题....

class Foo{
private:
  char charArray[32];
public:
  const char* getCharArray() const { return charArray; }
};

【讨论】:

    【解决方案3】:

    对于您提出的问题

    // in .h
    class Foo
    {
      private:
          char charArray[32];
      public:
         const char *getCharArray() const;
    };
    
    // in .cpp
    //    include the header!
    const char *Foo::getCharArray() const
    {
         return charArray;
    }
    

    请记住,上面返回的是指向 Foo 类的私有数据的指针(而不是数组的副本)。 const 限定符防止调用者(有意或无意地)使用返回的指针来操作类 Foo 的私有数据。

    但是,您的方法(在类中使用 char 的原始数组)在 C++ 中被认为是一种糟糕的方法。它也往往更难使用。

    更好的方法是使用标准容器而不是原始数组。

    // in .h
    #include <array>     //  C++11 and later
    class Foo
    {
      private:
          std::array<char, 32> charArray;
      public:
         std::array<char, 32> getCharArray() const;
    };
    
    // in .cpp
    //   include the header!
    std::array<char, 3> Foo::getCharArray() const
    {
         return charArray;
    }
    

    在这种方法中,Foo::getCharArray() 的调用者接收到整个数组的副本,而不是指针或对类 Foo 的私有数据的引用。调用者可以安全地更新它接收到的数组,然后将其提供回Foo 类(例如通过设置器)。然而,使用指针和原始数组,需要更多的体操才能达到类似的效果。

    可选地,上面可以返回一个conststd::array&lt;char, 3&gt;的引用,这样可以避免一些不必要的完整对象的复制。

    【讨论】:

      【解决方案4】:

      您可以做的没有人提到的事情是返回对原始字符数组的引用而不需要std::array。我从https://stackoverflow.com/a/34439639/10290252 那里偷来了这个想法。

      //.h file
      class Foo{
      private:
         char charArray[32];
      public:
         char (&getCharArray())[32];
      };
      
      
      // .cpp file
      char (&Foo::getCharArray())[32]{
         return charArray;
      }
      

      我想强调不要这样做! Nikos C 给出了正确答案,你应该效仿他们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2020-10-14
        • 2019-11-09
        相关资源
        最近更新 更多