0

構造内でクラスのオブジェクトを定義し、クラスの関数メンバーにアクセスしたいと考えています。これを達成することは可能ですか?

次のコードでは、でセグメンテーション違反が発生していps_test->AttachToInput(2145);ます。理由がわかりません。すべてが正しいように見えます。

class test
{
public:
    test();
    virtual ~test();
    int init_app(int argc, char* argv[]);   
    virtual void AttachToInput(int TypeNumber, int DeviceNo=0);
}

struct capture
{
    test h_app;
    gint port;
};

main()
{
    struct capture h_cap;
    test *ps_test = &h_cap.h_app;
    ps_test->AttachToInput(2145);
}
4

1 に答える 1

4

まず第一に、C++の aclassと aの唯一の違いは、クラスのメンバーはデフォルトであり、構造体のメンバーはデフォルトであるということです。コンパイラによって生成された ctor と dtor は、どちらの場合でも表示されます - プログラマが特に指定しない限り (たとえば、デフォルトの ctor をセクションに移動します)。そうしないと、マークされたユーザー定義型のインスタンスの構築と破棄は、明示的なパブリック宣言なしでは不可能になり、コンパイラによって生成された関数の目的そのものに逆らうことになります。structprivatepublicprivateclass

したがって、基本的に、あなたの例で行うことは、完全に合法的な2つのユーザー定義型の構成にすぎません。のインスタンスを作成するとcapture、 のインスタンスtestも作成されます。

できないAttachToInput()ことは、 の外部testおよび派生型からパブリックにアクセスすることですtestpublicこの行をコンパイルするには、関数を宣言する必要があります。

h_cap.h_app.AttachToInput(); // error: member function of `test` is protected

別の無関係なメモ(しかし、私はそれに出くわしたので言及します)、 yourclass testは への生のポインタを保持していますchar。指しているエンティティの有効期間が、ポインターを保持するオブジェクトの有効期間を超えることが保証されている場合は、生のポインターを保持しても問題ありません。それ以外の場合、オブジェクト自体がエンティティの破壊に関与している可能性が非常に高くなります。誰が何を所有し、誰が割り当てと割り当て解除の責任を負うのかを確認する必要があります。

編集:この回答を書いている間、アラン・ストークスがコメントセクションで同じことを提案したことに注意してください。:)

EDIT2 :派生クラスの宣言方法に応じて、わずかな見落とし、暗黙のデフォルト アクセスも基本クラスに対して想定されます。C++ の構造体とクラスの違いは何ですか? を参照してください。.

于 2013-09-21T10:12:54.653 に答える