C ++ использует это, чтобы использовать аксессор - PullRequest
0 голосов
/ 09 октября 2019

Я создал метод доступа в своем классе SparseMatrix. Я пытаюсь написать функцию-член symmetric, и я хотел бы получить доступ, используя свой метод доступа к частным данным класса в моей симметричной функции.

У меня есть функция транспонирования, и this->transpose() работает так, как я думал. Поэтому я попробовал this->[] и, конечно, это не работает. Возможно, потому что это перегрузка оператора.

bool SparseMatrix::symmetric() const
{
  SparseMatrix A_T(m_m,m_n);
  A_T = this->transpose();
  bool is_symmetric;
  for (int row=0; row<m_m; ++row)
    {
      int cols = A_T.m_colIndex[row].size();
      for (int col=0; col<cols; ++col)
        {
          array<int, 2> A_tuple  = {row,m_colIndex[row][col]};
          array<int, 2> A_T_tuple  = {row,A_T.m_colIndex[row][col]};
          if (A_T[A_T_tuple] == this->operator[](A_tuple))
            {
              is_symmetric = true;
            }
...

Добавлен еще один код для ясности.

Вот сообщение об ошибке.

Undefined symbols for architecture x86_64:
  "SparseMatrix::operator[](std::__1::array<int, 2ul>&) const", referenced from:
      SparseMatrix::symmetric() const in SparseMatrix.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Просто поместите звездочку внутри фигурных скобок:

(*this)[some_index];

Это необходимо, потому что оператор разыменования * имеет более низкий приоритет, чем оператор индекса. Для обновленного вопроса:

У вас, похоже, есть const версия operator[], объявленная, но не определенная, учитывая, что вы получаете ошибку ссылки, а не ошибку компиляции. Вам нужно предоставить тело для этого operator[]() const, чтобы вы могли использовать его из вашего symmetric метода. Вы не можете использовать неконстантный оператор из константного метода.

0 голосов
/ 09 октября 2019

Правильно ли, что this реализует operator[]? Если это так, используйте this->operator[](/*arguments*/) вместо this->[]

...