2017-02-15 15 views
0

Мне дали упражнение, которое включает в себя много возиться (глядя на) с битами в char[n].Возможно ли перегрузить оператор [] для доступа к определенному биту char без определения класса?

Я должен проверить некоторые геометрические свойства bit[n][8], полученные путем взятия каждого символа и разбиения его на его биты. Я знаю, что могу получить доступ к bit[a] знака c, делая что-то вроде c&((1<<8)>>n).

Я хотел бы знать, есть ли способ сделать c[n] фактически bec&((1<<8)>>n). Я попытался bool operator [](char c,int n);, но это дало мне это:

error: ‘bool operator[](char, int)’ must be a nonstatic member function 
bool operator [](char c,int n); 
+0

@ FrançoisAndrieux должно быть, но мой вопрос об использовании оператора *, который не существует для этого типа еще * –

+2

Что об использовании 'зОго :: bitset' для достижения что ты хочешь? –

+0

_ «почему нисходящие?». Не было моего, но это не могло объяснить это. –

ответ

3

Как сказано в сообщении об ошибке, оператор [] должен быть функцией членом класса или структуры, и он должен принимать один параметр. Однако вы можете написать бесплатную именованную функцию (т. Е. Не оператор), чтобы делать то, что вы хотите.

+0

Я дошел до того, что функции скучны. Но отлично. –

+4

@ Mark Writing - это то, о чем программирование, поэтому вам лучше найти их интересными. –

+0

нет, программирование о том, чтобы заставить компьютер выполнять приказы. –

0

Описание: char Оберточный класс Char. Два примера из main() демонстрируют, что вы можете использовать значения Char так же, как и значения char, за исключением того, что Char имеет оператор [] для получения бита его значения в каком-либо заданном индексе.

#include <iostream> 

class Char { 
    char c; 
public: 
    Char() = default; 
    Char(const Char&) = default; 
    Char(char src) : c(src) {} 

    Char& operator = (char src) { c = src; return *this; } 

    operator const char&() const { return c; } 
    operator char&() { return c; } 

    // Special [] operator 
    // This is read-only -- making a writable (non-const) 
    // version is possible, but more complicated. 
    template <typename I> 
    bool operator [](I bit_idx) const { return !!(c & (char(1) << bit_idx)); } 
}; 

int main() { 
    // Example 1 
    // Initialize a new Char value, just like using char. 
    Char my_char = 'x'; 
    // Math operators work as expected 
    ++my_char; 
    // And cout will produce the same output as a char value 
    std::cout << "Bit 3 of '" << my_char << "' is "; 
    // But unlike a char, the [] operator gives you 
    // the bit at an index, as a bool value. 
    std::cout << my_char[3] << "\n\n"; 

    //Example 2 
    // Specify the Char type in a range-based for loop to 
    // iterate through an array of char values, as Char values. 
    const char str[] = "Tasty"; 
    for(Char ch : str) { 
     // check if value is nonzero, the same as you would a char value 
     if(ch) { 
      // Send the value to cout, 
      // cast to an int to see the ASCII code 
      std::cout << ch << " (" << static_cast<int>(ch) << ") "; 

      // Count down from bit 7 to 0 and use 
      // the special [] operator to get each 
      // bit's value. Use this to output each 
      // value's binary digits. 
      for(int bit=7; bit>=0; --bit) { 
       std::cout << ch[bit]; 
      } 
      std::cout << '\n'; 
     } 
    } 
} 

Выход:

Bit 3 of 'y' is 1 

T (84) 01010100 
a (97) 01100001 
s (115) 01110011 
t (116) 01110100 
y (121) 01111001 
+0

ничего себе! благодаря! Использую это, если бы не выполнял функции. –