2016-05-04 10 views
2

私はこれを理解しようとしていました(今私が行っている場所は7amです)。オブジェクトをポインタに変換できませんC++

インスタンス化されたオブジェクトのアドレスをポインタに設定する際に問題があります。ここでは主な機能です:私はクラスのすべてのメソッドを定義する別のcppファイルを持っている

#include<iostream> 

typedef uint32_t word_t; 
class PositionVector { 
    public: 
     word_t * vec; 
/*some other member variables */ 
     PositionVector(); 
     PositionVector(size_t len); 
     PositionVector & operator &(); 
     PositionVector & operator !(); 
     ~PositionVector(); 

/*some other member functions*/ 
     void resize(size_t len); 
}; 

#include "position_vector.h" 
int main(){ 
    PositionVector res = PositionVector(10); 
    PositionVector * ptr; 
    ptr = &res;     // <--- WHERE IT BREAKS 
} 

AはHファイル「position_vector.h」のバージョンを剥ぎ取ら。

これは、コードのいくつかの大規模なセットの一部であるが、ここで失敗したコンパイルです:

g++-4.9 -std=c++11 -Werror -Wall -Wextra -g -Isrc -ggdb -c -o bin/main.o src/main.cpp 

それはエラーで失敗します。私はスーパーの基本的な何かが欠けする必要がありますが、私は」

g++-4.9 -std=c++11 -Werror -Wall -Wextra -g -Isrc -ggdb -c -o bin/main.o src/main.cpp 
src/main.cpp: In function ‘int main()’: 
src/main.cpp:27:9: error: cannot convert ‘PositionVector’ to ‘PositionVector*’ in assignment 
    ptr = &res; 
     ^

veはちょうどすべてのナイターを引っ張って、私は仕事に走らなければなりません...だから私は本当にいっぱいだと思うことはできません。あなたのクラスでoperator&をオーバーロードしました

答えて

7

class PositionVector { 
     // ... 
     PositionVector & operator &(); 
}; 

あなたよりは、アドレスを取得しようとすると、コンパイラはPositionVector&を返し、あなたのオーバーロードされたメンバ関数を呼び出します。これはPositionVector*に割り当てられないため、エラーが発生します。

+3

また、これを演算子の戻り値の型として保持したい場合は、 'std :: addressof'を使用してポインタを取得できます。 – vu1p3n0x

+0

ありがとう!あなたは人生の節約者です... @ vu1p3n0x - 正に言及されています。私はまだスタック割り当てクラスでヒープ割り当てクラスメンバーを処理する方法については混乱していますが、それは別の時間です... –

+0

@FrancoSolleza最良の方法は、ヒープ割り当てスタックを手動で処理しないことです。普通のオブジェクトの場合は 'std :: unique_ptr'や' std :: shared_ptr'でラップし、配列には 'std :: vector'などを使います。その後、生涯や例外的な安全性について心配する必要はありません。 – Jens

関連する問題