4

このQ/Aから、構造体はC ++で継承可能であることがわかりましたが、それは良い習慣ですか、それともクラスを使用する方が望ましいですか?どちらの場合が好ましく、どの場合がそうではありませんか?

これは必要ありませんでしたが、今ではさまざまな種類のメッセージがたくさんありますが、経度は同じです。それらをchar配列のバイナリで取得し、memcpyを使用して構造体にコピーしてフィールドに入力します(std :: copyを使用して実行できるかどうかはわかりません)。

共通のヘッダーを持つ基本構造体からすべての構造体を継承できるのは素晴らしいことだと思うので、これを検索しました。したがって、2番目の質問は次のようになります。クラスでこれを行う場合、バッファーからクラスにmemcpy(またはstd:copy)を実行することは可能ですか?

4

2 に答える 2

5

ビット単位のコピーを使用できるかどうかは、structまたはタグとは関係がなく、言われたかclassどうかにのみ依存します。それらが標準(9/6 [class])で定義されているかどうかは、基本的に、コンストラクター以外の特別なメンバーメソッドを宣言する必要がないということです。structclass is_trivially_copiable

その後、ビット単位のコピーは3.9 /2[basic.types]の標準で許可されます。

自明にコピー可能な型のオブジェクト(基本クラスのサブオブジェクトを除く)のT場合、オブジェクトが型の有効な値を保持しているかどうかに関係なく、オブジェクトをT構成する基になるバイト(1.7)をまたはの配列にコピーできcharますunsigned charcharまたはの配列の内容がunsigned charオブジェクトにコピーバックされた場合、オブジェクトはその後元の値を保持する必要があります。[例:

#define N sizeof(T)
char buf[N];
T obj; // obj initialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
                           // `obj` might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of `obj`
                           // of scalar type holds its original value

—例を終了]

注:パディングバイトのビット単位のコピーは、Valgrindのレポートにつながります。

std::copy同じ効果に使用する:

char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);
于 2012-10-23T07:32:21.623 に答える
1

との唯一の違いはstructclassそのメンバーへのデフォルトのアクセス修飾子です。それとstructそのpublicclassprivate(特に明記されていない限り)。それ以外はstructclassC++でも同じです。読みやすさのために、クラスよりもPDO(Plain Data Objects)の方が構造体を好む場合がありますが、それは実際にはコーディング規約次第です。

于 2012-10-23T07:10:05.197 に答える