Как написать функцию get для частного массива char в классе как в .h, так и в .cpp? - PullRequest
1 голос
/ 11 июля 2019

Как написать функцию get для частного массива символов в классе как в .h, так и в .cpp?Я не знаю, должен ли я вместо этого использовать тип 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?
}

Ответы [ 4 ]

2 голосов
/ 11 июля 2019

Используйте 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* на массив, используйте функцию-член data(): std::array:

void printFoo(const Foo& foo)
{
    printf("%s", foo.getCharArray().data());
}
1 голос
/ 11 июля 2019

То, что вы можете сделать, о чем никто не упомянул, это вернуть ссылку на массив raw char без необходимости 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;
}

Я хочу подчеркнуть, однако НЕ ДЕЛАЙТЕ ЭТОГО !! Никос С дал правильный ответ, и вы должны последовать их примеру.

1 голос
/ 11 июля 2019

На ваш вопрос в качестве вопроса

// 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 (например, через установщик).Принимая во внимание, что при использовании указателя и необработанного массива для достижения аналогичного эффекта требуется больше гимнастики.

При желании в приведенном выше примере может быть возвращена ссылка const на std::array<char, 3>, что позволяет избежать некоторыхненужное копирование завершенных объектов.

1 голос
/ 11 июля 2019

Поскольку предыдущий ответ фактически не ответил на вопрос ....

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