←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3587

コピーコンストラクタについて1
投稿者---kaz(2005/03/27 18:45:35)


長いプログラムで申し訳ありませんが、(ポイントはコピーコンストラクタだけだと思うのですが、一応全部コピーさせて頂きました。)以下のプログラムを実行すると

rr 2
aa 0
bb 0
gg 0
kk 0
pp 0
qq 0
ww 1
zz 0
MapArray: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
MapArray: destroyed
Element: destroyed
4 [main] a 1956 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
641 [main] a 1956 open_stackdumpfile: Dumping stack trace to a.exe.stackdump

というエクセプションが発生します。いろいろと調べてみたのですが、理由がわかりません。
最後の↓が原因なんですが、なぜだか理解できません。よろしくお願いします。

MapArray wcc = wc;

MapArray.h と MapArray.cpp にわけてあるのでこのスレッドのツリーに.cppの方をはります。長くて本当に申し訳ありません。
------------------------------ここから プログラム MapArray.h

#ifndef MAPARRAY_H
#define MAPARRAY_H

#include<iostream>
#include<string>

using namespace std;

class Element {
    public:
        Element();
        Element(string key);
        Element(string key,int val);
        ~Element();

        string getKey() const;
        int getValue() const;
        Element* getNext() const;
        void insert(Element* elem);
        void removeNext();
    
    private:
        string mKey;
        int mValue;
        Element* mNext;
};


class MapArray {
    
    public:
        MapArray();
        MapArray(string str);
        MapArray(const MapArray &o);
        ~MapArray();
        
        MapArray& operator=(MapArray &o);
        int operator[](string key);  
        void insert(string key,int val);
        void erase(string key);
        void begin() const;
        bool end() const;
        void next() const;
        string key() const;
        int value() const;
        int count(string key) const;
        int size() const;
    
    private:
        int mSize;
        Element* mTop;
        Element* mTail;
        mutable Element* mCussor;
        void add(string key,int val);
};

#endif





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> コピーコンストラクタについて2 3588 kaz 2005/03/27 18:47:23


No.3588

コピーコンストラクタについて2
投稿者---kaz(2005/03/27 18:47:23)


MapArray.cppです。
よろしくお願いします。

#include "MapArray.h"
#include <sstream>

Element::Element(){}

Element::Element(string key):mKey(key),mValue(0),mNext(NULL){}

Element::Element(string key,int val):mKey(key),mValue(val),mNext(NULL){}

Element::~Element(){
    cout << "Element: destroyed" << endl;
}

string Element::getKey() const{
    return mKey;
}

int Element::getValue() const{
    return mValue;
}

Element* Element::getNext() const{
    return mNext;
}

void Element::insert(Element* elem){
    elem->mNext = this->mNext;
    this->mNext = elem;
}

void Element::removeNext(){
    Element* elem = mNext;
    if (elem == NULL){
        return;
    }
    this->mNext = elem->mNext;
    delete elem; // why?
}

MapArray::MapArray():mSize(0),mTop(NULL),mTail(NULL),mCussor(NULL){}

MapArray::MapArray(string str){
        mSize = 0;
        mTop = NULL;
        mTail = NULL;
        mCussor = NULL;
    if (str == ""){
        // do nothing
    }else{
        istringstream is(str);
        string key;
        int value;
        while(is.good() && is.peek()!=EOF){
            is >> key >> value;
            insert(key,value);
        }

    }
}

/** 
 * Copy Constractor 
 *
 */
MapArray::MapArray(const MapArray &o){
    mSize = o.mSize;
    mTop = o.mTop;
    mTail = o.mTail;
    mCussor = o.mCussor;
}

MapArray::~MapArray(){
    cout << "MapArray: destroyed" << endl;
    for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
         delete elem;
    }
}

MapArray& MapArray::operator=(MapArray &o){
    mSize = o.size();
    mTop = o.mTop;
    mTail = o.mTail;
    mCussor = o.mCussor;
}

int MapArray::operator[](string key){
    for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
        if (elem->getKey() == key){
            return elem->getValue();
        }
    }
    add(key,0);
    return 0;
}   

void MapArray::insert(string key,int val){
    if (count(key) == 0){
        add(key,val);
    }else{
        // do nothing
    }
}

void MapArray::erase(string key){
    // for the first element
    Element* top = mTop;
    if ( top->getKey() == key){
        mTop = top->getNext();
        mSize--;
        delete  top;
    }else{
        for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
            Element* nextElement = elem->getNext();
            if (nextElement->getKey() == key){
                elem->removeNext();
                mSize--;
                break;
            }
        }
    }
}

void MapArray::begin() const{
    mCussor = mTop;
}

void MapArray::next() const{
    mCussor = mCussor->getNext();
}

bool MapArray::end() const {
    return mCussor == mTail->getNext();
}

string MapArray::key() const{
    return mCussor->getKey();
}

int MapArray::value() const{
    return mCussor->getValue();
}

int MapArray::count(string key) const{
    if (mSize == 0){
        return 0;
    }
    for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
        if (elem->getKey() == key){
            return 1;
        }
    }
    return 0;
}

int MapArray::size() const{
    return mSize;
}

void MapArray::add(string key,int val){
    Element* newElement = new Element(key,val); 
    if (mSize == 0){
        mTail = newElement;
        mTop = mCussor = mTail;
    }else if (mSize == 1){
        if (key < mTop->getKey()){
            mTop = newElement;
            mCussor = mTop;
            mTop->insert(mTail);
        }else{
            mTail->insert(newElement);
            mTail = newElement;  
        }
    }else{
        for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
            Element* nextElement = elem->getNext();
            if (nextElement == NULL){
                mTail->insert(newElement);
                mTail = newElement;
                break;    
            }else{
                if (key < nextElement->getKey()){
                    elem->insert(newElement);
                    break;
                }
            }
        }
    }
    mSize++;
}


int main(){
    MapArray wc("ww 1 rr 2");
    string s;
    wc["bb"];
    wc["aa"];
    wc["gg"];
    wc["qq"];
    wc["pp"];
    wc["rr"];
    wc["zz"];
    wc["kk"];
    
    for(wc.begin(); !wc.end(); wc.next()){
        cout << wc.key() << " " << wc.value() << endl;
    }

    MapArray wcc = wc;  // <- ここがおかしい
    
    return 0;
}






この投稿にコメントする

削除パスワード

No.3589

Re:コピーコンストラクタについて2
投稿者---RAPT(2005/03/27 22:54:12)


全体をよく読んでいませんが、気になったところをちょっと。

MapArray::~MapArray(){
    cout << "MapArray: destroyed" << endl;
    for(Element* elem=mTop; elem!=NULL; elem=elem->getNext()){
         delete elem;
    }
}

delete で削除後に elem->getNext() と参照していますが、
これはアクセス違反です。

次のようにする必要があります。

MapArray::~MapArray(){
    cout << "MapArray: destroyed" << endl;
    Element* thisElement = NULL;
    for(Element* elem = mTop; elem != NULL; ){
        thisElement = elem;
        elem = elem->getNext();
        delete thisElement;
    }
}

あと個人的に。operator=で引数がconst参照でないのはなぜなのでしょうか。




この投稿にコメントする

削除パスワード

No.3593

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/28 15:02:31)


貴重なご指摘ありがとうございます。
先週からC++をはじめたばかりでたくさんおかしなことばかりしてるかもしれません。

>あと個人的に。operator=で引数がconst参照でないのはなぜなのでしょうか。

すいません、申し訳ありませんがよろしければも少し詳しく指摘されていることについて
おしえていただけないでしょうか?

それから

MapArray::MapArray(const MapArray &o){
    mSize = o.mSize;
    mTop = new Element(o.mTop->getKey(),o.mTop->getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop->getNext(); elem!=NULL; elem=elem->getNext()){
        counter++;
        Element* e = new Element(elem->getKey(),elem->getValue());
        prev->insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
}

MapArray& MapArray::operator=(MapArray &o){
    mSize = o.mSize;
    mTop = new Element(o.mTop->getKey(),o.mTop->getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop->getNext(); elem!=NULL; elem=elem->getNext()){
        counter++;
        Element* e = new Element(elem->getKey(),elem->getValue());
        prev->insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
}




と二つとも同じコードになってしまうのですが、こういうものなのでしょうか?
よろしくお願いします。


この投稿にコメントする

削除パスワード

No.3594

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/28 15:31:14)


ご指摘されてたことがわかりました。const をつけるということはそのオブジェクトがかわらないことを保障ためにつけるということですよね。すいません、つけるの忘れてました。。。

<pre>MapArray&amp; MapArray::operator=(const MapArray &amp;o){
    mSize = o.mSize;
    mTop = new Element(o.mTop-&gt;getKey(),o.mTop-&gt;getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop-&gt;getNext(); elem!=NULL; elem=elem-&gt;getNext()){
        counter++;
        Element* e = new Element(elem-&gt;getKey(),elem-&gt;getValue());
        prev-&gt;insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
         return *this;
}
</pre>


あとすごくわからないのが、この

return *this;

なんですが、この場合、ポインターがさしている実際のオブジェクトのメモリ領域、つまりオブジェクトそのものをかえしているのですが、なぜリターンする型がみなさん

MapArray&

リファレンスなんでしょうか?ただ、MapArrayとするのとは何がちがうのでしょうか?


この投稿にコメントする

削除パスワード

No.3599

Re:コピーコンストラクタについて2
投稿者---RAPT(2005/03/28 22:29:03)


const 参照は付け忘れですね。了解です。

> あとすごくわからないのが、この
> return *this;
> なんですが、この場合、ポインターがさしている実際のオブジェクトの
>メモリ領域、つまりオブジェクトそのものをかえしているのですが、
> なぜリターンする型がみなさん
> MapArray&
> リファレンスなんでしょうか?
> ただ、MapArrayとするのとは何がちがうのでしょうか?

*this はオブジェクト自身であることはお分かりでしょうか。
任意の型 T について、T& で *this を返すことは、結果的に、自分自身に
対してアクセス可能な状態であることになります。

ここで、T& ではなく T を返すと、T tmpObj = *this; となり、
オブジェクト自身ではなく、複製を返すことになります。



この投稿にコメントする

削除パスワード

No.3601

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/28 22:44:25)


>const 参照は付け忘れですね。了解です。
>
>> あとすごくわからないのが、この
>> return *this;
>> なんですが、この場合、ポインターがさしている実際のオブジェクトの
>>メモリ領域、つまりオブジェクトそのものをかえしているのですが、
>> なぜリターンする型がみなさん
>> MapArray&
>> リファレンスなんでしょうか?
>> ただ、MapArrayとするのとは何がちがうのでしょうか?
>
>*this はオブジェクト自身であることはお分かりでしょうか。
>任意の型 T について、T& で *this を返すことは、結果的に、自分自身に
>対してアクセス可能な状態であることになります。

これはわかるのですが、リファレンスというのは結局ポインターとはなにがちがうんでしょうか。リファレンスはオブジェクト自身をかえしているわけではないですよね。結局はヒープ領域に確保されてるオブジェクトをさしてるアドレスの値をかえしているんでしょうか?ってそれだったらポインターですよね。うーん。ちょっと混乱です。

>ここで、T& ではなく T を返すと、T tmpObj = *this; となり、
>オブジェクト自身ではなく、複製を返すことになります。

ということはもう一回NEWしてオブジェクトをつくりなおしているということですよね。
うーん、もうちょっと勉強してみます。ありがとうございます。


この投稿にコメントする

削除パスワード

No.3604

Re:コピーコンストラクタについて2
投稿者---RAPT(2005/03/29 01:17:54)


えっと、多分いくつか勘違いされていると思うので、ちょっと確認してください。
任意の型を T 型とします。

■thisポインタについて
this はポインタで、T* 型となります。
*this で T 型となります。

■参照とポインタ
・ポインタ
int    a = 10;
int* p_a = &a;
これは
int* p_a;
p_a = &a;
でもOK。ポインタの指す先が無効と明示するには NULL を代入する。
int* p_a = NULL;

・参照
int    a = 10;
int& r_a = a;
ここで
int& r_a;
r_a = a;
としようとするとエラー。参照は、別名とも言え、常に実体が必要。

●ポインタ変数は「ポインタ変数」という実体(上記例では p_a)を持っており、
その指し示す先が無効(== NULL)である場合もありうる。

●参照は、何らかの変数の別名(エイリアス)であり、実体を共有する。
そのため、ポインタ変数におけるNULLと同じ意味を持つ状態(=情報の格納先が
無い(無効である)状態)は存在しない。

★ゆえに、
T& T::bar()
{
    return *this;
}
は、T 型のオブジェクトのインスタンス(実体)そのものを返す。

★ここで、それがヒープに確保されているかスタックに確保されているかは別問題。
  T* pT = new T();
  pT->bar();
とされれば、*this(pT そのもの)はヒープに居る事になるでしょうし、
  T obj;
  obj.bar();
とされれば、*this(obj そのもの)はスタックに居る事になるでしょう。
# ここでは単純に静的に確保されたものはスタック、動的にはヒープとして説明。


kazさんの言葉を用いるならば、
> リファレンスはオブジェクト自身をかえしているわけではないですよね。
(ここでは)リファレンスはオブジェクト自身をかえしていることになります。

(多分分かりやすいと思える)具体的な使用例としては、深い構造体変数に
アクセスしたい場合などに使用できます。
  string& str = m_MyStructure.m_Second.m_value.m_First.m_str;
  size_t size = str.size();
  cout << str << endl;
などのように使えば、コードが見やすくなるでしょう。

また、関数引数にポインタではなく参照を使用することにより、関数内部で
ポインタの有効チェックをする必要はなくなり(NULLは指定できないため)、
有効な値を指定する事を義務付ける事ができます。



この投稿にコメントする

削除パスワード

No.3608

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/29 08:00:05)


非常に丁寧な説明ありがとうございます。理解できたと思います。心から感謝です。


この投稿にコメントする

削除パスワード

No.3607

Re:コピーコンストラクタについて2
投稿者---かずま(2005/03/29 03:22:50)


> と二つとも同じコードになってしまうのですが、こういうものなのでしょうか?
その代入演算子にはいろいろ問題があります。

MapArray wc("AA 1 BB 2"), wcc("CC 3 DD 4 EE 5"); の場合、wc は、
("AA",1), ("BB",2) という 2つの Element オブジェクトを持っています。
wc = wcc; により、("CC",3), ("DD",4), ("EE",5) の 3つの Element オブ
ジェクトが複製され、wc はそれらを持つことになります。

でも、最初に持っていた ("AA",1) と ("BB",2) は delete されていません。

他にも問題がありまして、例えば、wc = wc; でどうなると思いますか? 



この投稿にコメントする

削除パスワード

No.3614

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/29 20:51:37)


毎度ありがとうございます。ご指摘感謝します。指摘されたところを直してみましたが、
まだ、完璧ではありません。


MapArray& MapArray::operator=(const MapArray &o){
    cout << "Operator= is invoked." << endl;
    // delete the all the Elements in the left hand side object
    Element* currentElement = NULL;
    for(Element* elem=mTop; elem!=NULL;){
        currentElement = elem;
        elem = elem->getNext();
        delete currentElement;
    }

    mSize = o.mSize;
    mTop = new Element(o.mTop->getKey(),o.mTop->getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop->getNext(); elem!=NULL; elem=elem->getNext()){
        counter++;
        Element* e = new Element(elem->getKey(),elem->getValue());
        prev->insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
    return *this;
}

のようにして以下を実行したところ、

int main(){
    MapArray a("ZZ 1 AA 2");
    MapArray b("CC 2 BB 3 KK 4");

    a["ZZ"]++;
    
     a = b;

    cout << a;


}


MapArray: destroyed
MapArray: destroyed
Operator= is invoked.
Element: destroyed
Element: destroyed
BB 3
CC 2
KK 4
MapArray: destroyed
Element: destroyed
Element: destroyed
Element: destroyed
MapArray: destroyed
Element: destroyed
Element: destroyed
Element:

との結果なんですが、最初の

MapArray: destroyed
MapArray: destroyed

この二つはどこからきているものなのでしょうか?

それから、ご指摘いただいたように

a =a;

を実行したら久しぶりのSegmentation Faultがでてきました。すでにoperator=の中で消した後にまた、それを呼び出してコピーしようとしたからだと思うのですが、これを回避するには
operator=の最初で o instanceof this みたいなことをすればできると思うのですが、
C++ではこれをどのようにするのでしょうか?よろしくお願いします。


この投稿にコメントする

削除パスワード

No.3620

Re:select関数のバッファリングについての疑問
投稿者---かずま(2005/03/30 14:27:16)


> との結果なんですが、最初の
>
> MapArray: destroyed
> MapArray: destroyed
>
> この二つはどこからきているものなのでしょうか?

ostream& MapArray::operator<<(ostream&, const MapArray&) の中で
何か変なことをやっているのではありませんか?


> operator=の最初で o instanceof this みたいなことをすればできると思うのですが、
> C++ではこれをどのようにするのでしょうか?よろしくお願いします。
    if (&o == this) return *this;



この投稿にコメントする

削除パスワード

No.3621

Re:コピーコンストラクタについて2
投稿者---かずま(2005/03/30 14:35:29)


すみません。
Mozilla FireFox で記事を書いたら、題名が全然違うものになってしまいました。
削除パスワードも効かないようなので、この訂正記事にて失礼します。


この投稿にコメントする

削除パスワード

No.3622

リファレンスについての質問
投稿者---kaz(2005/03/30 17:27:12)


>ostream& MapArray::operator<<(ostream&, const MapArray&) の中で
>何か変なことをやっているのではありませんか?

すいません、変なことをコンストラクタの中でやっていました。。。
MapArray::MapArray():mSize(0),mTop(NULL),mTail(NULL),mCussor(NULL){}

MapArray::MapArray(string str){
        mSize = 0;
        mTop = NULL;
        mTail = NULL;
        mCussor = NULL;
        //MapArray();
    if (str == ""){
        // do nothing
    }else{
        istringstream is(str);
        string key;
        int value;
        while(is.good() && is.peek()!=EOF){
            is >> key >> value;
            insert(key,value);
        }

    }
}

もともとは
MapArray::MapArray(){
MapArray("");
}
のようにやっていたのですが、結果は同じでした。コンストラクタの中でコンストラクタをよんでいるので2個オプジェクトがつくられてしまいます。
public A(){
     this("")
}

public B(string s){
    mStr = s;
}

本当は上記のようになる予定だったんですが、方法があれば教えてください。

コピーコンスとラクタについてまた質門があります。
mainの中で

MapArray a("aa 1 bb 2");
MapArray b = a;

このようにするとコピーコンストラクタが呼ばれます。これを実行すると
$ a.exe
Copy Construsctor is invoked.
Element: destroyed <−コピーコンストラクタのなかで消されている
AssocArray: destroyed
Element: destroyed
Element: destroyed
AssocArray: destroyed
Element: destroyed
Element: destroyed

のように
MapArray::MapArray(const MapArray &o){
    cout << "Copy Construsctor is invoked." << endl;
    // delete the all the Elements in the left hand side object
    Element* currentElement = NULL;
    for(Element* elem=mTop; elem!=NULL;){ // このループにより消されている
        currentElement = elem;
        elem = elem->getNext(); 
        delete currentElement;
    }

    mSize = o.mSize;
    mTop = new Element(o.mTop->getKey(),o.mTop->getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop->getNext(); elem!=NULL; elem=elem->getNext()){
        counter++;
        Element* e = new Element(elem->getKey(),elem->getValue());
        prev->insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
}

とここでコピーコンストラクタにはこのループの作業が必要ないとのことに気づきました。
なぜなら、コピーコンストラクタが呼ばれるときには左辺にはなにも入ってない状態だからです。とこのようにoperator= との実装の少しの違いを自分なりに理解したのですが、これで
正しいでしょうか?


最後にこれについてなんですが、

>> operator=の最初で o instanceof this みたいなことをすればできると思うのですが、
>> C++ではこれをどのようにするのでしょうか?よろしくお願いします。
>
    if (&o == this) return *this;


ここで this はこのオブジェクトのアドレスをもっています。&o は代入されるオブジェクトのリファレンスです。

&o == this

というのはリファレンスとアドレスを比べているようなのですが、リファレンスというのは
アドレスとオブジェクトそのもの二つの要素をもっているのでしょうか?


この投稿にコメントする

削除パスワード

No.3625

Re:リファレンスについての質問
投稿者---REE(2005/03/30 19:15:12)


>もともとは
>MapArray::MapArray(){
> MapArray("");
>}
>のようにやっていたのですが、結果は同じでした。コンストラクタの中でコンストラクタをよんでいるので2個オプジェクトがつくられてしまいます。
>(略)
>本当は上記のようになる予定だったんですが、方法があれば教えてください。

MapArray(string str);の宣言をMapArray(string str="");に変えることで、引数なしのコンストラクタを兼ねられます。
デフォルト引数というやつです。

>(略)
>とここでコピーコンストラクタにはこのループの作業が必要ないとのことに気づきました。
>なぜなら、コピーコンストラクタが呼ばれるときには左辺にはなにも入ってない状態だからです。とこのようにoperator= との実装の少しの違いを自分なりに理解したのですが、これで
>正しいでしょうか?

はい、正しいです。

>ここで this はこのオブジェクトのアドレスをもっています。&o は代入されるオブジェクトのリファレンスです。

&oはオブジェクトのリファレンスではありません。
ここでの&はアドレス演算子です。
&がリファレンスを表すのは、型を表す時だけです。



この投稿にコメントする

削除パスワード

No.3590

Re:コピーコンストラクタについて2
投稿者---かずま(2005/03/27 23:33:17)


> int main(){
>     MapArray wc("ww 1 rr 2");
>     MapArray wcc = wc;  // <- ここがおかしい
> }

wc は、(ww,1), (rr,2) の 2つの Element オブジェクトを持っています。
wc.mTop は (rr,2) を指しています。

wcc は、wc の持っている 2つの Element オブジェクトを共有します。
wcc.mTop は 同じ (rr,2) を指しています。

main 終了時、wcc のデストラクタがすべての Elementオブジェクトを delete
します。もう、Element オブジェクトは存在しません。

次に、wc のデストラクタが自分が持っているつもりの Element オブジェクトを
delete しようとします。でも、それは既に delete されていて存在しません。



この投稿にコメントする

削除パスワード

No.3592

Re:コピーコンストラクタについて2
投稿者---kaz(2005/03/28 14:54:17)


はっと目が覚めました。ありがとうございます。以下のようにしたらいけました。
こんな感じでするものなのでしょうか?

MapArray::MapArray(const MapArray &o){
    mSize = o.mSize;
    mTop = new Element(o.mTop->getKey(),o.mTop->getValue());
    mCussor = mTop;
    Element* prev = mTop;
    int counter= 1;
    for(Element* elem=o.mTop->getNext(); elem!=NULL; elem=elem->getNext()){
        counter++;
        Element* e = new Element(elem->getKey(),elem->getValue());
        prev->insert(e);
        if (counter == mSize){  
            mTail = e;
            break;
        }
        prev = e;
    }
}




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity