C++
1#include <iostream> 2#include <fstream> 3#include <vector> 4#include <algorithm> 5#include <functional> 6#include <string> 7#include <iomanip> 8 9using namespace std; 10 11//基底クラス 12class Bottom 13{ 14public: 15 short x1; //描画領域 左上 X座標 2B 16 short y1; //描画領域 左上 Y座標 2B 17 short x2; //描画領域 右下 X座標 2B 18 short y2; //描画領域 右下 Y座標 2B 19 long foreColor; //前景色 4B 20 long backColor; //背景色 4B 21 22 int recg; //派生クラス認識 23 24 void get(char h2, char h3, char h4, char h5, char h6, char h7, char h8, char h9, char h10, char h11, char h12, char h13, char h14, char h15, char h16, char h17); 25 26 //値取得 27 virtual void get2(); 28 29 void get3(int i); 30 31 //表示 32 virtual void LK(); 33 34 //コンストラクタ 35 Bottom(); 36 37 //デストラクタ 38 virtual ~Bottom(); 39}; 40 41//直線 42class StraightLine : public Bottom 43{ 44public: 45 46 char lineKind; //線種(0:実線、1:点線) 47 short startX; //描画開始 X座標 2B 48 short startY; //描画開始 Y座標 2B 49 short endX; //描画終了 X座標 2B 50 short endY; //描画終了 Y座標 2B 51 52 //コンストラクタ 53 StraightLine(); 54 55 //デストラクタ 56 ~StraightLine(); 57 58 //値取得 59 void get2(char h18, char h20, char h21, char h22, char h23, char h24, char h25, char h26, char h27); 60 61 //表示 62 void LK(); 63}; 64 65//基底コンストラクタ 66Bottom::Bottom() 67{ 68 69} 70 71//基底デストラクタ 72Bottom::~Bottom() 73{ 74 75} 76 77//基底表示 78void Bottom::LK() { 79 cout << "ボトムやで" << endl; 80} 81 82void Bottom::get(char h2, char h3, char h4, char h5, char h6, char h7, char h8, char h9, char h10, char h11, char h12, char h13, char h14, char h15, char h16, char h17) { 83 //unsigned使ってるのは、符号なしでbitを移動させたいから 84 85 //描画領域 左上 X座標 86 x1 = (unsigned char)h3; 87 x1 <<= 8;//左に8ビット移動 88 x1 = (x1 | (unsigned char)(h2 & 0xff));//データを連結 89 90 //描画領域 左上 Y座標 91 y1 = (unsigned char)h5; 92 y1 <<= 8;//左に8ビット移動 93 y1 = (y1 | (unsigned char)(h4 & 0xff));//データを連結 94 95 //描画領域 右下 X座標 96 x2 = (unsigned char)h7; 97 x2 <<= 8;//左に8ビット移動 98 x2 = (x2 | (unsigned char)(h6 & 0xff));//データを連結 99 100 //描画領域 右下 Y座標 101 y2 = (unsigned char)h9; 102 y2 <<= 8;//左に8ビット移動 103 y2 = (y2 | (unsigned char)(h8 & 0xff));//データを連結 104 105 //前景色 106 foreColor = (unsigned char)h13; 107 foreColor <<= 8;//左に8ビット移動 108 foreColor = (foreColor | (unsigned char)(h12 & 0xff));//データを連結 109 foreColor <<= 8;//左に8ビット移動 110 foreColor = (foreColor | (unsigned char)(h11 & 0xff));//データを連結 111 foreColor <<= 8;//左に8ビット移動 112 foreColor = (foreColor | (unsigned char)(h10 & 0xff));//データを連結 113 114 //背景色 115 backColor = (unsigned char)h17; 116 backColor <<= 8;//左に8ビット移動 117 backColor = (backColor | (unsigned char)(h16 & 0xff));//データを連結 118 backColor <<= 8;//左に8ビット移動 119 backColor = (backColor | (unsigned char)(h15 & 0xff));//データを連結 120 backColor <<= 8;//左に8ビット移動 121 backColor = (backColor | (unsigned char)(h14 & 0xff));//データを連結 122} 123 124//基底値取得 125void Bottom::get2() { 126 127} 128 129void Bottom::get3(int i) { 130 recg = i; 131} 132 133//直線コンストラクタ 134StraightLine::StraightLine() 135{ 136 x1 = 0; 137 y1 = 0; 138 x2 = 0; 139 y2 = 0; 140 foreColor = 0; 141 backColor = 0; 142 recg = 0; 143 lineKind = 0; 144 startX = 0; 145 startY = 0; 146 endX = 0; 147 endY = 0; 148} 149 150//直線デストラクタ 151StraightLine::~StraightLine() 152{ 153 154} 155 156 157 158//直線値取得 159void StraightLine::get2(char h18, char h20, char h21, char h22, char h23, char h24, char h25, char h26, char h27) 160{ 161 lineKind = h18;//線種 162 163 //描画開始 X座標 164 startX = (unsigned char)h21; 165 startX <<= 8;//左に8ビット移動 166 startX = (startX | (unsigned char)(h20 & 0xff));//データを連結 167 168 //描画開始 Y座標 169 startY = (unsigned char)h23; 170 startY <<= 8;//左に8ビット移動 171 startY = (startY | (unsigned char)(h22 & 0xff));//データを連結 172 173 //描画終了 X座標 174 endX = (unsigned char)h25; 175 endX <<= 8;//左に8ビット移動 176 endX = (endX | (unsigned char)(h24 & 0xff));//データを連結 177 178 //描画終了 Y座標 179 endY = (unsigned char)h27; 180 endY <<= 8;//左に8ビット移動 181 endY = (endY | (unsigned char)(h26 & 0xff));//データを連結 182} 183 184//直線表示 185void StraightLine::LK() { 186 cout << "描画領域(X1,Y1,X2,Y2) 前景色,背景色 線種 描画開始,終了" << endl; 187 cout << "\"直線 [" << setfill(' ') << right << setw(4) << dec << x1 << "," << setfill(' ') << right << setw(4) << dec << y1 << "]" 188 << " - [" << setfill(' ') << right << setw(4) << dec << x2 << ", " << setfill(' ') << right << setw(4) << dec << y2 << "]" 189 << " [0x" << setfill('0') << setw(6) << hex << foreColor << "] [0x" << setfill('0') << setw(6) << hex << backColor << "]"; 190 191 192 if (lineKind == 0) { 193 cout << " 実線 "; 194 } 195 else { 196 cout << " 点線 "; 197 } 198 cout << "[" << setfill(' ') << dec << setw(4) << startX << ", " << setfill(' ') << dec << setw(4) << startY << "]"; 199 cout << "[" << setfill(' ') << dec << setw(4) << endX << ", " << setfill(' ') << dec << setw(4) << endY << "]"; 200 201 202 //printf("[%4d,%4d] - [%4d,%4d]\"\n",startX, startY, endX, endY); 203 cout << endl; 204 cout << endl; 205} 206 207int main(){ 208 //直線用インスタンス(この配列に要素入れる) 209 shared_ptr<StraightLine> straightine(new StraightLine)[2]; 210 211 //直線出力用インスタンス 212 std::vector<std::shared_ptr<Bottom>> bases;//全部入れるテーブル 213 shared_ptr<StraightLine> straightine2(new StraightLine); 214 215 //ここの処理で入れる 216 for(int i = 0; i < 2; i++){ 217 //インスタンスに値を格納 218 straightine->get(27, 1, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0); 219 straightine->get2(0, 0, 0, 0,0, 0, 0, 0, 0); 220 straightine->get3(1); 221 //ベクターに値をプッシュ 222 bases.push_back(straightine); 223 224 //もともとはここでポインタのアドレスをインクリメントしていた。 225 226 227 } 228 229 230 231 232 233 234 for (auto it = std::begin(bases); it != std::end(bases); ++it) 235 { 236 //直線出力 237 if (dynamic_cast<StraightLine>(*it) != 0) 238 { 239 straightine2 = dynamic_cast<StraightLine*>(*it); 240 straightine2->LK(); 241 } 242 } 243 244 return 0; 245}
インスタンスをshared_ptrの配列ににしましたが、それぞれの配列の中に要素を入れ、その後、ベクターのテーブルに入れた後、イテレータで回してそれぞれ出力したいのですが、方法が分かりません。
どなたか教えてくださると幸いです。
そもそもstraightineが定義されていない問題が一つと、shard_ptrつかってるんだからdeleteは勝手にしてくれるやろ問題となんでshared_ptrにポインタ入れてとるんや問題が
頑張って読もうと思ったけどなんでgetって名前でメンバー書き換えているのか皆目理解できないしget, get2, get3って名前の時点で頭に入ってこないし、straightineとbasesは何がちゃうねんと思うし、そのdynamic castの使い方未定義動作だとおもうのでstd::dynamic_pointer_cast使えって思うし`dynamic_cast<StraightLine>(*it) != 0`とは???という思いで溢れていて読む気が0になってしまったのでさじを投げます。
回答2件
あなたの回答
tips
プレビュー