2017-02-15 3 views
0

Ich habe eine Übung gegeben, die eine Menge von Fummeln (Betrachten) mit Bits in einem char[n] enthält.Ist es möglich, den Operator [] zu überladen, um auf ein bestimmtes Bit eines Zeichens zuzugreifen, ohne eine Klasse zu definieren?

Ich muss einige geometrische Eigenschaften eines bit[n][8] überprüfen, indem man jedes char erhält und es in seine Bits aufspaltet. Ich weiß, dass ich auf bit[a] des char c zugreifen kann, indem ich etwas wie c&((1<<8)>>n) mache.

Ich würde gerne wissen, ob es einen Weg gibt machen c[n] tatsächlichc&((1<<8)>>n) sein. Ich habe versucht, bool operator [](char c,int n); aber das gab mir dies:

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

@ FrançoisAndrieux sollte sein, aber meine Frage ist, über einen Operator * verwenden, die nicht für diese Art existiert noch * –

+2

Was ist 'std :: bitset' mit zu erreichen was willst du? –

+0

_ "Warum die Downvotes?" _ War nicht meins, aber _Schwarz der Forschung_ könnte das erklären. –

Antwort

3

Da die Fehlermeldung sagt, Operator [] muss eine Elementfunktion einer Klasse oder Struktur sein, und es muss einen Parameter nehmen. Sie können jedoch eine freie benannte Funktion (d. H. Kein Operator) schreiben, um das zu tun, was Sie wollen.

+0

Ich habe den Punkt erreicht, an dem Funktionen langweilig sind. Aber gut. –

+4

@Mark Writing-Funktionen sind das, worum es beim Programmieren geht, also sollten Sie sie besser finden. –

+0

Nein, bei der Programmierung geht es darum, dass der Computer Befehle ausführt. –

0

Hier ist eine char Wrapper-Klasse namens Char. Die beiden Beispiele in main() demonstrieren, dass Sie Char-typisierte Werte genauso wie char Werte verwenden können, mit der Ausnahme, dass Char einen [] -Operator hat, um sein Wertbit bei einem gegebenen Index zu erhalten.

#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'; 
     } 
    } 
} 

Ausgang:

Bit 3 of 'y' is 1 

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

wow! Vielen Dank! Würde das nutzen, wenn ich keine Funktionen erledigt hätte. –

Verwandte Themen