できるサブクラスCの構造体をC++で使用のポインタの構造体のCコードについて教えてください。

StackOverflow https://stackoverflow.com/questions/127290

  •  02-07-2019
  •  | 
  •  

質問

あ副そうすることによって:

Cコード:

struct foo {
      int k;
};

int ret_foo(const struct foo* f){ 
    return f.k; 
}

C++のコード:

class bar : public foo {

   int my_bar() { 
       return ret_foo( (foo)this ); 
   }

};

あり extern "C" 周辺にはC++のコードとそれぞれのコードは独自に作成ユニットです。

この携帯全体のコンパイラ?

役に立ちましたか?

解決

この法律に基づいて行われる。C++クラスや構造体が同一の概念を除き、すべてのstruct員は、公衆がデフォルトです。することになりそう。いるかどうかのできる構造体には変わりありませんようけることができる。aクラスです。

問題点もあります。はありま 無保証 レイアウトの整合性からコンパイラをコンパイラです。その場所にコンパイルドの異なるコンパイラによC++のコードは、問題委員のレイアウト(パディング中).ここでも起こる利用の場合CおよびC++コンパイラと同じベンダーです。

I してい このようgccは、g++.というのはプロジェクトを用いて複数の大型構造体.残念なことに、g++が満載の構造体の大幅な市場を混乱に陥りgccによる重要な問題の共有化間でのオブジェクトのCおよびC++のコードです。このために手動でセット梱包や挿入のパディングは、CおよびC++コードの構造体と同じです。注ただし、この問題に関わらず、サブクラス.実はなかった場合は、サブクラスCの構造体。

他のヒント

確かない使用をお勧めなのか、サブクラス.したほうが良いと思われますの変更をデザインへの利用組成物ではなく継承関係を示します。のうち会員

foo*m_pfoo;

のバークラスでしかできない仕事です。

その他のものでなければならないことできるようになっています。クラスFooWrapperを含むものの構造に対応するゲッター方法。したときサブクラスのラッパー.そうすることによって、問題の仮想デストラクタがなくなっています。

"こんなに導くコンクリートから。" —サタ

"作る、葉以外の授業課題となる" —Meyers

この誤りをサブクラス以外インタフェース。すべrefactorご図書館です。

技術的には、だいたいでんを起動しませんよ。g., 削除するポインタを導出クラスによりポインタをその基底クラスsubobject.必要な時に必要なだけ extern "C" C++のコードです。ありました。も貧しいデザイン。

これは完全に法律がこの混乱のためのその他のプログラマー.

利用できる産を残すつもりはない遺産を残延長のC構造体の方法やコンストラクタ.

サンプル

struct POINT { int x, y; }
class CPoint : POINT
{
public:
    CPoint( int x_, int y_ ) { x = x_; y = y_; }

    const CPoint& operator+=( const POINT& op2 )
    { x += op2.x; y += op2.y; return *this; }

    // etc.
};

伸びる構造体が"あり"の邪悪ながられるものではありません禁止されています。

なんと、それよう。

この携帯全体のコンパイラ?

最もレコード店ディスクユニオン.以下を考えます:

foo* x = new bar();
delete x;

そのためには、fooのデストラクタが必要仮想いを明確にい分けるどれがいいですか?ど使わない new とに由来objectdいカスタムdestructorsがしてしまう可能性もあります。ラッキーだった。

/編集:一方、コードがどうなっている問題、相続のない優位性を構成する。を提m_pGladiator.

これは完全に法律できるので実際のMFC CRectとCPointます。CPointらポイント(定義されwindef.h),やCRectらRECT.だけを飾るオブジェクトカンパニーとして、会員ます。どんな拡張するオブジェクトデータだ。この場合で複雑なC構造体である痛みをデフォルトの初期化するクラスを含むデフォルトのコンストラクタを手軽に行うことができへの対応が課題です。

だからこ

foo *pFoo = new bar;
delete pFoo;

しん、からコンストラクタとデストラクタは自明できな割合。

まもなたを包み込むC++オブジェクト'extern"C"'では実際に過ごす、C++ タイプ されます。

とは思わないでも問題です。動きが明確に定義されるためのバッファーとして一定の大き生活時間の問題な混合割当てのC++とCコード)いと考えている。で完全に携帯全体のコンパイラ.

の問題destructorsは現実のものが適用されず、基底クラスデストラクタな仮想なのためのC構造体.でも意識する必要があがないを妨げるものをこのパターンです。

で、portablyはできません使用仮想機能が含まれdestructors).

いることをお勧めしそうでないこいバーが含まれFoo.

class Bar
{
private:
   Foo  mFoo;
};

ったり下がったりよくわからないのはなぜだくret_foo員。現在の方がコードは恐ろしく理解され難い。何が難しいので約を実際の授業の会員数はの取得/設定方法について教えてほしい。

このサブクラスが構造体はC++が、危険と他になるとのことですコードではほ誰かが実際にいます。なったと思い強固な共通の解決です。

しかし仕事がないのであると考えて保証されます。以下は見積からISO C++10/5:

基底クラスsubobjectがレイアウト(3.7)とは異なるレイアウトの最も由来のオブジェクトの同一の型でなくてはなりません。

それはなかなか出てこないものでどのように"実世界の"こうし出します。

編集:

その基準がない限の一部を首都圏における基底クラスsubobjectレイアウトである必要はありませんからコンクリートオブジェクトと同じベースタイプです。その結果、その他の前提条件など、ポッドされている。必ずしも真の基底クラスsubobject.

編集:

代替アプローチは、その行動が定義は、'foo'員'bar'を変換オペレーターです。

class bar {
public:    
   int my_bar() { 
       return ret_foo( foo_ ); 
   }

   // 
   // This allows a 'bar' to be used where a 'foo' is expected
   inline operator foo& () {
     return foo_;
   }

private:    
  foo foo_;
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top