2017-10-12 10 views
0

私は現在、スライディングブリックパズルを複製するクラスの割り当てに取り掛かっています。私がC++を使用してから数年が経ちました。私はすぐに再学習し、課題を一気にやってみようとしています。私はバイオエンジニアリングを学び、いつもMATLABを使用していますが、私が取る数少ないコンピュータサイエンスのクラスではC++に適応するのも難しいです。C++クラスでのクローン関数の作成

私の質問は、私が作成しなければならないクローン機能です。私は現在デバッガに問題があるので、プログラムを実行しようとするとちょうどクラッシュし、なぜか分かりません。クローン関数は、名前が示すように、クラスオブジェクトのクローンを作成することになっています。私のコードはあなたの参照のために以下に提供されています。

#include <stdio.h> 
#include <stdlib.h> 
#include <vector> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstring> 
#include <list> 
using namespace std; 

struct move 
{ 
    int piece; 
    char direction; 
}; 

class SBP 
{ 
public: 
    vector< vector<int> > state; 
    int width; //columns 
    int height; //rows 

    void load(string filename); 
    void display(); 
    SBP clone(); 
}; 

void SBP::load(string filename) 
{ 
    int rownum = 1; 
    char n; 
    string str; 
    ifstream file(filename.c_str()); 
    getline(file, str); 
    width = str[0]-'0'; 
    height = str[2]-'0'; 
    while (getline(file, str)) 
    { 
     vector<int> row; 
     for (int i = 0; i < str.size(); ++i) 
     { 
      n = str[i]; 
      if (n != ',') 
      { 
       if (n == '-') 
       { 
        row.push_back((str[i + 1] - '0')*(-1)); 
        i = i + 1; 
       } 
       else 
       { 
        if (str[i + 1] == ',') 
         row.push_back(n - '0'); 
        else 
        { 
         row.push_back((str[i] += str[i + 1]) - '0'); 
         i = i + 1; 
        } 
       } 
      } 
     } 
     state.push_back(row); 
     rownum = rownum + 1; 
    } 
    printf("File has been loaded.\n\n"); 
} 

void SBP::display() 
{ 
    int num; 
    printf("The state of the game is: \n"); 
    printf("%i,%i,\n", width, height); 
    for (int r = 0; r < height; r++) 
    { 
     for (int c = 0; c < width; c++) 
     { 
      num = state[r][c]; 
      printf("%i,", num); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
} 

SBP SBP::clone() 
{ 
    SBP clonestate; 
    clonestate.width = width; 
    clonestate.height = height; 
    for (int r = 0; r < height; ++r) 
    { 
     for (int c = 0; c < width; ++c) 
      clonestate.state[r][c] = state[r][c]; 
    } 
    return clonestate; 
} 

int main(int argc, char **argv) 
{ 
    string filename = argv[1]; 
    SBP puzzle, clonestate; 
    puzzle.load(filename); 
    puzzle.display(); 
    clonestate = puzzle.clone(); 
    clonestate.display(); 

    return 0; 
} 

誰かが私を助けてくれることを願っています。これは課題の始まりに過ぎず、私はこれを修正するまで移動することができません。ありがとうございました。

+1

を持っていないように、デフォルトのコピーコンストラクタを使用します。それはすべての値に基づいているので、operator =は十分である必要があります – Joe

+1

コピーコンストラクタと代入演算子は必要な処理を行う必要があります。クローン機能が必要だと私が考えることができる唯一の時間は、あなたが継承を使って作業しているときであり、それがあなたが何を保持しているのか分からないことがあります。 – user4581301

+1

実際には、コピーコンストラクタや代入演算子を記述する必要はありません。少なくともクラスが定義されている方法ではありません。コンパイラで生成されたコピーコンストラクタと代入演算子は、うまく動作するはずです。自分で試してみてください。 SBPを作成し、ロードして割り当てを行います。それは動作するはずです。 – Joe

答えて

0

クローンで値を割り当てる前にサイズを変更する必要があると思います。

またはあなただけの限り、あなたはクラスがクローン機能を必要としないはず指針部材

SBP SBP::clone() 
{ 
    return *this; 
} 
+0

'clone'関数の一般的なパターンは、クローンされたインスタンスへのポインタを返すことです:' SBP * SBP :: clone(){return new(* this);} '。 –

関連する問題