2016-03-29 10 views
-2

スピードの理由から、私はポインタを使ってオブジェクトを渡してきました。しかし、オブジェクト内のオブジェクトのメンバ変数にアクセスしようとすると、プログラムがクラッシュしてしまいます。私が得意でないものがありますか?C++ポインタを介してネストされたオブジェクトのメンバーにアクセス

/* 
ClassA 
- ObjectB 
    --Member X 
*/ 

class A 
{ 
    int x; 
} 

class B 
{ 
    A* obj; // initialized in constructor 
    B(); 
    func(); 
} 

B::B(std::vector<A> vectorA) 
{ 
    this->obj = &(vectorA.at(0)) 
} 

B::func() 
{ 
    A* pointerA = this->obj 
    std::cout << pointerA->x << std::endl; // causes crash 
} 
+2

_'A * obj; //コンストラクタで初期化された '_どのように正確に?投稿[MCVE]してください。 –

+0

「スピードの理由から...」ポインタが高速であることを確信していますか?あなたのコンパイラはそうは思わないでしょう。 – tadman

+1

'this-> obj =&(vectorA.at(0));'注意しないと、これは恐ろしく危険です。あなたのポインタは、Cromが指し示すことになるでしょう。 – user4581301

答えて

1

以前のポスターでは、コメントを正しく削除したため、コンストラクタに渡されたベクターが参照ではなく、したがってポインタがぶら下がっている状態で破棄されたことが指摘されました。

B::B(std::vector vectorA)

B::B(std::vector &vectorA)

する必要がありますあなたのようなもの見知らぬ人に感謝!

+0

あなたの質問でそれを編集したので、私は実際にそれがあなたの部分のタイプミスであると思った;)それが答えを削除した理由です。 –

1

あなたはあまりにもこの1でセミコロンが欠落している

class A 
{ 
    int x; 
}; 

ことをセミコロン

  A* pointerA = this->obj; 

修正が欠落しています。私が得 エラー:

11:9:エラー:1:ISO C++のないタイプ[-fpermissive]

8と 'FUNC' の宣言を禁止エラー:新しいタイプのリターンに定義されなくてもよいですタイプ

8:1:注意:(おそらくセミコロンが 'B' の定義の後に欠落している)

14:1:エラー:のプロトタイプ 'BB :: funcが()' 内の任意の一致しませんクラスB:

11:4:エラー:候補は:int B :: func()

最初に修正してください。

0

Like @ user4581301は指摘しました:this->obj = &(vectorA.at(0))は非常に危険です。関数が終了するとすぐにポインタがぶら下がるように。

関数シグネチャB::B(std::vector<A> vectorA)を使用すると、関数が渡すベクトルのコピーが作成され、関数が終了すると破棄されます。これは、あなたが作成したポインタがぶら下がっていることを意味します。あなたが関数内で使用しているベクトルは、実際にあなたが引数として渡したものと同じである

B::B(std::vector<A> &vectorA) 

この方法:

は、私はあなたのような何かをするためのものだと思います。この方法では、渡すベクトルが破棄されない限り(または指摘されたようにサイズが変更されている限り)、ポインタは有効です。

関連する問題