2012-03-07 6 views
1

ポインタを値に設定できますが、オフセットはわずかです。以下のような値へのポインタと別の値の設定

何か:

m_NewPosition = &m_Position + Vector3(0,0,10); 

だから値NewPositionは、実際の位置プラス10インフロントです。

C++を使用しています。

+2

なぜ、 'm_Position'のアドレスにベクトルを追加したいのですか? –

+0

本当に奇妙な質問ですが、線形メモリへのポインタに3次元のオフセットを追加するとどうなりますか?厳密にベクトル演算を話しているなら、&のコードスニペットに問題はありません。 – Ylisar

+2

これは、5kgを得るために2kgと3mmを加えるようなものです。意味がありません。 –

答えて

1

はい、ポインターでarithematicを実行できますが、新しくポイントされたアドレスが何か有効な逆参照を指していない限り、UBになります。

+0

迅速な返信ありがとうございます。Vector3は私が作ったものです。上記を試してみると、Vector3型の+演算子がないと言われています。ポインタを扱う新しい演算子を作成する必要がありますか? – Dave

+0

@Dave: 'Vector3'が独自のデータ型の場合、当然のことながら、標準ライブラリの' + '演算子はそれを認識せず、カスタムクラス型のオーバーロードを提供しません。 –

+0

私はOPの質問に誤解しています(これはあまり明確ではありませんでした):私は、OPが 'm_Position'と同期して' m_NewPosition'を維持して、 'm_Position'へのすべての変更が反映されると思う'm_NewPosition'にあります。 –

3

ポインターが配列を指している場合にのみ、ポインターでオフセットを使用できます。

もしあなたがchar arr[10];を持っていて、それを何かで埋めるならば、あなたはchar *p = arr + calc_offset();をやることができます。 C++標準から

評価を生成してはならない 、ポインタオペランドと結果ポイント 同じ配列オブジェクトの要素に、または配列オブジェクトの最後の要素過去1両方の場合オーバーフロー;それ以外の場合は、動作 は定義されていません。

+0

なぜdownvote ??私の答えは間違っていませんか? –

+0

これは確かに唯一のケースではありません。構造体を考えてみましょう。 – user606723

+2

@ user606723:ポインタ演算は配列内でのみ定義されます。 –

1

実際に探しているのは、結果がm_Positionの値に応じて変化する関数です。私はm_接頭辞によって、これらが両方のメンバーであるとみなします。 m_Position + Vector3(0,0,10)が一定であれば、それだけで通常のメンバ関数のようになります。

Vector3 m_NewPosition() const { 
    return m_Position + Vector(0,0,10); 
} 

しかし、あなたは機能を変更する機能が必要な場合は、std::function<Vector3(void)>を使用して、このようにそれを割り当てることができます:

m_NewPosition = [&m_Position]() { return m_Position + Vector3(0,0,10); }; 

単純な例ですが、ベクトルの代わりに整数を使用しています。

#include <iostream> 
#include <functional> 

struct Foo 
{ 
    Foo() 
     :X(0) 
    { 
     NewX = [&X]() { return X + 10; }; 
    } 

    int X; 
    std::function<int(void)> NewX; 
}; 

int main() 
{ 
    Foo f; 
    for (f.X=0; f.X<10; ++f.X) 
    { 
     std::cout << f.NewX() << '\n'; 
    } 
} 

とオンラインデモあなたがそれの出力表示できるように:http://ideone.com/XTwE7


を別のオプションは、m_Positionとm_NewPositionの両方がプライベートであることを確認しておらず、決してそれらを直接変更することであるが、唯一のアクセサ関数を介して、例えば

+1

私はあなたが質問を正しく理解した唯一の人だと思います(公正ではないことは明らかです)。 –

1

m_Positionのアドレスを使用してベクトルを追加することは奇妙に思えます。おそらく、ポインタがどこにあるのか分かっていれば、それはもっと役に立ちます。 m_NewPositionまたはm_Positionのいずれかの種類がわからないので、手助けするのは難しいです。しかし、ここでポインタが必要なことはほとんどありません。

私のようなものに見えるクラスである、これら2つの変数がタイプPositionであることを前提としています:

class Position { 
public: 
    Position(int x, int y, int z) : x(x), y(y), z(z) { } 
private: 
    int x; 
    int y; 
    int z; 
} 

これが事実である、とあなたはVector3で、この位置への追加を適用する場合第2オペランドとして、このクラスにoperator+をオーバーロードする必要があります。あなたが見ることができるように

class Position { 
public: 
    Position(int x, int y, int z) : x(x), y(y), z(z) { } 
    Position operator+(const Vector3& vector) { 
    return Position(x + vector.x, y + vector.y, z + vector.z); 
    } 
private: 
    int x; 
    int y; 
    int z; 
} 

operator+方法は、あなたがこの位置にベクトルを追加することができます。これを行うには、このような何かを行います。今度はあなたがやるだけです:

m_NewPosition = m_Position + Vector3(0,0,10); 

この例では、m_Positionは変更されません。いつもと同じ位置にとどまります。 operator+を呼び出すと、更新されたコンポーネントで新しいPositionが返されます。 m_Positionを更新する場合は、代わりにoperator+=をオーバーロードします。

+0

私は住所に追加したくありません。 Vector3は3つの浮動小数点数を保持するクラスです。 m_Positionとm_NewPositionはどちらもVector3型です。キャラクターに複数のコリジョンコンポーネントを追加しようとしていました。各コンポーネントは、プレーヤーの位置に距離を加えて配置されます。それは質問を混同している知識の私の不足です。新しい位置をポインターにすることによって、コンポーネントはプレーヤーと一緒に移動します。 – Dave

0

私が正しく理解していれば、あなたはm_NewPositionは、それが(reactive programmingの線に沿って何か)に変更された場合でも、すべてのm_Positionに等しい倍を加えた空間でオフセット一部になりたいです。これはあなたがそれをやろうとしたやり方では達成できません。あなたはポインタに関する良い参考文献を見つけるべきでしょう。しかし、いくつかのソリューションがあります。

最初のものは、関数/メソッド、like @Benjamin Lindley proposedを使用することである:NewPositionが計算された値であるので、それは関数でそれを計算するために理にかなって:

class Character 
{ 
    public: 
    Vector3 getPosition() const 
    { 
     return m_Position; 
    } 

    Vector3 getNewPosition() const 
    { 
     return getPosition() + Vector3(0, 0, 10); 
    } 

    private: 
    Vector3 m_Position; 
}; 

これは意味、カプセルの全ポイントでありますオブジェクトの内部を隠す:オブジェクトの「可視」プロパティは、メンバ関数(メソッド)を介してのみアクセス可能で、格納されている方法を変更したり、オンザフライで計算することができます(例:m_NewPosition) 。

別の解決策は、より複雑な(とあなたのケースでは、おそらく適切ではない)、相対的な位置を表す新しいクラス記述することです:

class RelativePosition 
{ 
    public: 
    RelativePosition(Vector3 const & origin, Vector3 const & offset) 
     : m_Origin(origin), m_Offset(offset) 
    {} 

    Vector3 getAbsolutePosition() const 
    { 
     return m_Origin + m_Offset; 
    } 

    private: 
    Vector3 const & m_Origin; 
    Vector3 m_offset; 
}; 

注方法RelativePosition店舗その起源への参照を、そしてありませんコピー;そのため、原点が修正(すなわち移動)された場合、相対位置はこの変更を反映します。

m_newPositionを表すために、このクラスのインスタンスを使うことができます。これは実際には相対位置(m_Positionから、オフセットはVector3(0、0、10)を基準にしています)です。しかし、私が以前に言ったように、私はこの解決法はおそらくあなたの場合には不幸だと思う。おそらく以前のアプローチに固執するべきです。

関連する問題