0

次のような構造体があるとします。

struct Foo
{
  const int bar;
  const char baz;

  Foo& operator=(const Foo& other)
  {
    memcpy(this,&other,sizeof(Foo)); //How am I supposed to write this decently?
    return *this;
  }
}

Foo のすべてのフィールドを final にしたいし、Foo 型の変数を他のプリミティブ値型と同じように動作させたい。たとえば、int、確かに次のようなものを書くことができます。

 int i = 0;
 i = 42;

 Foo foo = {007,'B'}
 foo = {42,'X'}

しかし、私の貧弱な Foo 型の場合、型の安全性チェックを回避するために memcpy のような手段に頼る必要がありますか? const 修飾子を削除し、フィールドをプライベートとしてマークし、いくつかのゲッターを追加できることはわかっていますが、それは重要ではありません。= 演算子の内容を適切に記述する方法があるかどうかを知りたいだけです。

前もって感謝します!

~~~~~

次の例を確認してください。

//If the = op is not implemented, this won't compile
Foo stat;
for(int i=0;i!=100;++i)
{
  stat = func(i);
  if(stat.bar == 0)...
}

//But weird thing is, if I declare the 'stat' inside the for block, it works just fine with gcc
for(int i=0;i!=100;++i)
{
  Foo stat = func(i); 
  //printf("%p\n",&stat); => same variable same address!!
  if(stat.bar == 0)...
}

それはあなたにとって意味がありますか?

4

3 に答える 3

6

constC++ では、コピー代入は all- typeに対して単純に意味がありません。実装しないでください。

const意味がある場合はすべての型を使用してください。ただし、C++ ではそう宣言しない限り、この型は動作しないintため、この型は動作しないことに注意してください。intconst

于 2012-09-11T13:13:54.123 に答える
3

この場合の適切な書き方は次のとおりです。

Chunk& operator=(const Foo& other) = delete;

(またはprivateC++11 より前)

すべてのメンバーがconstである場合、一体なぜメンバーを変更したいのですか?

于 2012-09-11T13:13:53.767 に答える
0

きれいな方法はありません。設計を再検討する必要があるという他の回答に同意します。

しかし、それがあなたの問題にとって最も害が少ないと思う場合は、さらにいくつかのオプションがあります。

Foo& operator=(const Foo& other)
{
    const_cast<int&>(bar) = other.bar;
    const_cast<char&>(baz) = other.baz;
    return *this;
}

または

#include <memory>

// Foo must never be used as a base class!
// If your compiler supports the c++11 final feature:
struct Foo final
{ /*...*/ };

Foo& operator=(const Foo& other)
{
    if (this != &other) {
        this->~Foo();
        new(this) Foo(other);
    }
    return *this;
}
于 2012-09-11T13:22:04.243 に答える