5

私はここでいくつかの C++ コードを見ていますが、何かを理解していません。関係ありませんが、ドキュメントに付属する YARP (ロボット ミドルウェア) チュートリアルからのものです。

virtual void getHeader(const Bytes& header) 
{
  const char *target = "HUMANITY";
  for (int i=0; i<8 && i<header.length(); i++) 
  {
    header.get()[i] = target[i]; 
  }
}

現在、ヘッダーは const への参照であるため、この関数内で変更することはできません。getが呼び出され、そのプロトタイプはchar *get() const;. どのheader.get()ように添え字を付けて変更できますか? プログラムは正常にコンパイルされます。ここで何が起こっているのか理解できていないかもしれませんが、C++ Primer で読んだ内容に基づいています...

少し説明をいただければ幸いです。

良い1日を、

4

4 に答える 4

1
char *get() const;

右側の const は、「このメンバーはクラス内で可変でないものは何も変更しない」ことを意味し、それを尊重しています-何も変更していません。実装はおそらく次のようなものです。

char *Bytes::get() const
{
    return const_cast<char *>(m_bytes);
}

ただし、返されるポインタは単純な「char*」です。次のように考えてください。

(header.get())[i] = target[i];
// or
char* p = header.get();
p[i] = target[i];
于 2013-06-01T06:30:57.733 に答える
0

ドキュメントを見る:

struct Bytes {
  char* get() const; // works
  char*& get() const; // would not work
  char* mem_;
};

このコードは悪い習慣ですが、完全に有効です。問題は、ポインターのコピーが作成され、クラスの constness がlost. C++ の constness は、大部分が概念的であり、簡単に破ることができます (多くの場合、影響がなくても)。私は実装者に文句を言います。次のようになります。

struct Bytes {
  char* get(); // works
  const char* get() const; // would not work
  char* mem_;
};
于 2013-05-14T14:29:30.733 に答える