2011-11-16 10 views
0

私は(明らかに)2つのコンストラクタを持つ非常に単純なクラス初期化を持っています。そして、新しいFriendshipを作成したいとき、最初の引数のthisポインタは適切なポインタ値を持ちます。秒はしません。このポインタはC++で突然0x0になります

私は、コード内でより良い説明します - これは、1つの私のコンストラクタです:

Friendship::Friendship(const User &u1, const User &u2){ 
    *user1 = u1; 
    *user2 = u2; 
} 

私は私のテストクラスでこれを行うと:

bool Test::insertFriendship(User *user1, User *user2) { 
    bool friendshipExists = verifyFriendship(user1, user2); 

    if(!friendshipExists) { 
     friendships.push_back(new Friendship(*user1, *user2)); // this is a ptr_vector container 
     return true; 
    } 
    return false; 
} 

それは私に一backでEXC_BAD_ACCESSエラーを与えますこれは、user1の 'this'ポインタがコンストラクタに到達して有効なメモリアドレスを指しているように見えるためですが、user2を実行するとき、user2の 'this'ポインタは0x0を指しています。それは基本的にオペラに行くとNULLを再見直そうとしていますトル=過負荷。

例:MEMは= 0x100100b20 this-> User2のMEMアドレス= 0x0の対処

this-> USER1年代 - エラー:それは新しい友情を作成しようとすると!

しばらく

U1のMEMアドレス= 0x7fff5fbff900 U2のMEMアドレス=私がしようとすると、いったいそれは動作しませんので、なぜ0x7fff5fbff898

私は意味は、これらのU1とU2 MEMアドレスが有効です。

*user1 = u1; //works cos this is 0x100100b20 
*user2 = u2; // fails cos this is 0x0 even though u2 is a valid mem address! 

誰もがこの奇妙な動作を知っていますか?私がpush_backでuser1とuser2を切り替えるとしても、それはまだ2番目に動作しません。それは決してうまくいかない厄介な第二のものです。

ああ、これは私のフレンドシップヘッダーファイルです。複雑すぎるものはありません。

#include "User.h" 

#ifndef Friendship_h 
#define Friendship_h 

class Friendship { 
    friend class Test; 
protected: 
    User *user1; 
    User *user2; 

public: 
    Friendship(const User &u1, const User &u2); 
    Friendship(const Friendship &a); 
    ~Friendship(); 
}; 

#endif 
+0

ポインタを使用しないでください。ポインタを正しく使う方法は誰も知らない。保証される。 –

+0

これは最初のもので動作し、私のオブジェクトのポインタはコンストラクタに渡すとA-okとなり、このポインタ(これは私が正直に操作できない)が問題を与えています。そして、それは初めてで、ちょうど2番目のものではありません(私は3つの "User"オブジェクト引数があれば、最初のものだけが動作すると仮定します)。 – swiftcode

答えて

3
Friendship::Friendship(const User &u1, const User &u2) 
{ 
    *user1 = u1; 
    *user2 = u2; 
} 

user1user2が初期化されていないので、あなたはまだそれを間接参照することはできません。私はあなたが意味すると思う:

Friendship::Friendship(const User &u1, const User &u2) 
{ 
    user1 = &u1; 
    user2 = &u2; 
} 
+0

それだけです!ありがとう。私の 'User'コピーコンストラクタはconstを使用していないので、私の友人のconstを削除しなければなりませんでした(ただし、特定の 'User'オブジェクトが0x0を指しているかどうかを確認する必要があります。 constを使用する場合、新しい 'User'オブジェクトに割り当てません)。 – swiftcode

+0

私はそれを私の答えで述べたはずですが、 'const'を使うのは間違いです。これらのオブジェクトを変更するためのポインタを隠します。 –

0

これは確かに奇妙なエラーです。しかし、私は最初に試してみることを提案します。

の代わりにこの:最初の形式が正しくない

bool Test::insertFriendship(User *user1, User *user2) { 
    bool friendshipExists = verifyFriendship(user1, user2); 

    if(!friendshipExists) { 
     friendships.push_back(new Friendship(user1, user2)); // did not dereference user1 and user2, only gave the pointers. 
     return true; 
    } 
    return false; 
} 

Friendship::Friendship(const User *u1, const User *u2) 
{ 
    user1 = u1; 
    user2 = u2; 
} 

と、この:

Friendship::Friendship(const User &u1, const User &u2) 
{ 
    *user1 = u1; 
    *user2 = u2; 
} 

はこれを行います。私はそれがまったく動くのに驚いています。 *user1 = u1 u1のディープコピーを作成し、それをuser1に入れるべきです。明示的にポインターをuser1にコピーする必要があります。user1 = u1ここで、u1はポインターです。とにかく助けてくれることを願っています。

+0

おっと、私は実際にそれを知らなかった、ありがとう!ですから、Davidが提案したようにuser1 =&u1を実行すると、それも問題ありません。これは基本的にuser1にu1のmemアドレスを与えることです。それが動作することは言うまでもありません。 – swiftcode

+0

はい、デビッドの提案は死んでいた、そして彼に小道具:)私はそのフォームを忘れていた。ポインタでない場合は、変数を渡すときに変数の隣に '&'記号を必要としないという利点があります。 – djhaskin987

+0

これを行わないでください。それはインタフェースの意味を変えます。現在、NULLオブジェクトがインタフェースを介して送信される可能性があります。恐ろしいアイデア。 –

関連する問題