2011-07-17 8 views
0

したがって、私はベースクラスを保持するポインターのベクトルを持っています。私はベクトルの中に2つの要素を作成し、抽象化のいくつかの層の後にそれらを交換しようとします。現在、これは爆発し、次のようになりmove.h内部のいくつかのエラーをスローするようにコンパイラーに指示します:いくつかの抽象レイヤーの後にポインターのベクトルでポインターを交換しようとしています

*c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/move.h: In function 'void std::swap(_Tp&, _Tp&) [with _Tp = Base]': 
D:\My Documents\pointertest2\main.cpp:52: instantiated from here 
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/move.h:81: error: cannot allocate an object of abstract type 'Base' 
D:\My Documents\pointertest2\main.cpp:7: note: because the following virtual functions are pure within 'Base': 
D:\My Documents\pointertest2\main.cpp:11: note:  virtual int Base::GetInt() 
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/move.h:81: error: cannot declare variable '__tmp' to be of abstract type 'Base' 
D:\My Documents\pointertest2\main.cpp:7: note: since type 'Base' has pure virtual functions* 

次のようにこの問題は原因コード:

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

class Base { 
    public: 

    virtual int GetInt() = 0; 
    int a; 
}; 

class Test : public Base { 
    public: 

    int GetInt() 
    { 
     return a; 
    } 
}; 

class Slot { 
    public: 

    Base *connected; 
}; 

int main() 
{ 
    std::vector<Base*> testVec; 

    Base *test = new Test; 
    testVec.push_back(test); 
    testVec[0]->a = 1; 

    Base *test2 = new Test; 
    testVec.push_back(test2); 
    testVec[1]->a = 2; 

    Slot slot; 
    slot.connected = testVec[0]; 

    Slot slot2; 
    slot2.connected = testVec[1]; 

    Slot* slottemp = &slot; 
    Slot* slottemp2 = &slot2; 

    std::swap(*slottemp->connected, *slottemp2->connected); 

    cout << testVec[0]->GetInt() << endl; 
    cout << testVec[1]->GetInt() << endl; 

    return 0; 
} 

あなたが最後に見ることができます私は、testVec [0]が2を返し、testVec [1]が1を返すことを期待しています。これは、私が探しているスワッピングされた値なので、1です。

私の頭はこれで爆発しています。私は要素0と1として含まれているポインタを交換する代わりの方法に全面的にオープンしています。これはこれまでのところ私が終わったところです。

答えて

2

あなたはoタイプBaseのスワップオブジェクト。

slottemp->connectedBase *であるため、*slottemp->connectedを交換すると、Base &が2つスワップします。我々はT = Baseでこれをインスタンス化した場合、我々はスワップのための一時的なBaseを構築しようと

template <class T> void swap (T& a, T& b) 
{ 
    T c(a); a=b; b=c; 
} 

;:Base &にはstd::swap過負荷がありませんので、コンパイラが戻って、このような何かを行くデフォルトに落ちますBaseには純粋な仮想関数があるため、これは失敗します。

1つのオプションは、Baseためstd::swap過負荷を書くことです:

namespace std { 
void swap(Base &a, Base &b) { 
    std::swap(a.a, b.a); 
} 
} 

これは、あなたが根本的Base Sを交換することができます。しかし、これは仮想基底クラスにはあまり適していません。誰かがFooBarを交換しようとするとどうなりますか?どちらもBaseから派生していますか?あなただけSlot sが交換されたい場合は

は、あなたがBase * Sを交換することができ、ないBase自身の:

std::swap(slottemp->connected, slottemp2->connected); 

あなたは変更がvectorに反映させたい場合は、あなたがSlotホールドを行う必要がありますイテレータ、またはこの特定のケースで

class Slot { 
    public: 
    Base **connected; 
}; 

// ... 
slot.connected = &testVec[0]; 
// ... 

std::swap(*slot.connected, ...); 

ベクトル内部ポインタへのポインタ、あなたは真のタイプを知っていますあなたが起動後にあれば、それはslicing(または悪化し、違法な鋳造)の可能性を誘うように、私はこのアプローチをお勧めしません

std::swap(*(Test *)slottemp->connected, *(Test *)slottemp2->connected); 

Testあるので、あなたも、この具体的な型にキャストして、そのように入れ替えることができますTest以外の型の値をベクトルに追加します。

+0

今感覚。 編集:ちょうどあなたの更新された答えを見た - それは私が探しているようだ、ありがとう。 – dr12

+0

@ dr12、それはあなたが交換しているものに関するすべてです。ベクトルを更新する場合は、私の3番目の例を参照してください。 – bdonlan

+0

多くのおかげで、3番目の例はまさに私が探しているものです – dr12

0

私は、ポインターではなくオブジェクトをスワップしようとしていると思いますが、接続ポイントがptrとして接続されていない場所にオブジェクトを取得しています。スワップではコンクリートオブジェクトのみがスワップでき、彼らは、サイズを持っている必要があります、抽象クラスは、サイズがありません。
試してみてください。

std::swap(slottemp->connected, slottemp2->connected); 

あなただけのポインタを入れ替えるようにします。

あなたは

slottempptr(addr01) -> vec[0] 
slottempptr2(addr02) -> vec[1] 

を持っていて、実行します。

swap(slottempptr,slottempptr2) 

だから、あなたが得る:

slottempptr2(addr02) -> vec[1] 
slottempptr(addr01) -> vec[0] 

しかし、VEC [0]とVECは、[1]変更されていない、あなただけのslottempptrを変更しました

+0

残念ながら、その結果は1,2という結果になるため、スワップされたものは何もないように見えます! – dr12

+0

ベクトル内のポインタを入れ替えるわけではないので、単に外部のポインタをslottempsからv [0]とv [1]にスワップしているだけで、ベクター内のポインタは交換されませんが、常にベクトルから印刷します。 –

+0

ああ、ありがとう。私が実際に達成しようとしているのは、testVec [1]がtestVec [0]になるように、そしてその逆に – dr12

関連する問題