前提・実現したいこと
学校の課題で円を描くプログラムを作っています。
発生している問題・エラーメッセージ
例外がスローされました (AlternatelyCircle.exe 内): Microsoft C++ の例外: std::bad_alloc (メモリの場所 0x003EED5C)。
下記ソースコードのelse(iが奇数の場合)でLineCircleのインスタンスをnewするときに例外が発生します。
//main.cpp #include "Circle.h" #include "ColorCircle.h" #include "LineCircle.h" int main() { Circle* circ; // 基本クラスの変数として宣言 svg svgObj; svgObj.open("test.html", 640, 400); for (int i = 0; i < 10; i++) { try { if ((i % 2) == 0) { // i が偶数の場合 circ = new ColorCircle(20 * (i + 1), 20, 10, "green"); } else {// i が奇数の場合 ここでエラー circ = new LineCircle(20 * (i + 1), 20, 10, "red", 3); } circ->draw(&svgObj); // ColorCircle と LineCircle が交互に呼び出される! } catch (bad_alloc e) { std::cout << "error" << endl; } } svgObj.close(); }
c++
1//LineCircle.h 2#pragma once 3#include "ColorCircle.h" 4using namespace std; 5 6class LineCircle : public ColorCircle { 7protected: 8 string LineColor; 9 int width; 10public: 11 LineCircle(); 12 LineCircle(int cx, int cy, int r, string c1, int w); 13 virtual void draw(svg*); 14 void setLineColor(string c1); 15 void setwidth(int w); 16}; 17
//LinceCircle.cpp #include"LineCircle.h" using namespace std; LineCircle::LineCircle() : ColorCircle() { LineColor = "black"; width = 1; } LineCircle::LineCircle(int cx, int cy, int r, string c1, int w) : ColorCircle(cx, cy, r, color) { //LineColor = c1; width = w; } void LineCircle::draw(svg* svgObj) { svgObj->drawCircle(x, y, rad, LineColor, width); } void LineCircle::setLineColor(string c1) { LineColor = c1; } void LineCircle::setwidth(int w) { width = w; }
//ColorCircle.h #pragma once #include"Circle.h" using namespace std; class ColorCircle : public Circle { protected: string color; //描画色 public: ColorCircle(); //コンストラクタ ColorCircle(int cx, int cy, int r, string c); //引数ありコンストラクタ virtual void draw(svg*); //Circleクラスのdrawをオーバーライド void setColor(string c); //色の設定 };
//ColorCircle.cpp #include "ColorCircle.h" using namespace std; ColorCircle::ColorCircle() : Circle() { color = "black"; } ColorCircle::ColorCircle(int cx, int cy, int r, string c) : Circle(cx, cy, r) { color = c; } void ColorCircle::draw(svg* svgObj) { svgObj->drawCircle(x, y, rad, color); } void ColorCircle::setColor(string c) { color = c; }
//Circle.h #pragma once #include<iostream> #include"svg.h" class Circle { protected: int x, y; int rad; public: Circle(); Circle(int cx, int cy, int r = 10); void setPosition(int x, int y); void setRadius(int rad); int getRadius(); void getPosition(int xy[]); virtual void draw(svg*) = 0; //bool checkOverlap(Circle circ); };
//Circle.cpp #include"Circle.h" #include<cmath> Circle::Circle() { //引数を指定しないコンストラクタ x = y = 0; rad = 10; } Circle::Circle(int cx, int cy, int r) { //引数を指定するコンストラクタ x = cx; y = cy; rad = r; } void Circle::setPosition(int x, int y) { this->x = x; this->y = y; } void Circle::setRadius(int rad) { this->rad = rad; } int Circle::getRadius() { return rad; } void Circle::getPosition(int xy[]) { xy[0] = Circle::x; xy[1] = Circle::y; } void Circle::draw(svg* svgObj) { svgObj->drawCircle(x, y, rad, "black"); } /*bool Circle::checkOverlap(Circle circ) { int txy1[2]; int txy2[2]; int trad; double d; trad = circ.getRadius() + this->getRadius(); //2つの半径の和 circ.getPosition(txy1); this->getPosition(txy2); //中心の距離 d = sqrt((txy1[0] - txy2[0]) * (txy1[0] - txy2[0]) + (txy1[1] - txy2[1]) * ((txy1[1] - txy2[1]))); if (d > trad) { return false; } else { return true; } }*/
//svg.h #pragma once #include<fstream> #include<string> using namespace std; class svg { private: ofstream ofs; public: void open(string filename, int width, int height); void close(); void drawCircle(int x, int y, int rad, string color = "black", int width = 0); };
//svg.cpp #include"svg.h" void svg::open(string filename, int width, int height) { ofs.open(filename); ofs << "<svg width='" << width << "' height='" << height << "' >" << endl; } void svg::close() { ofs << "</svg>"; ofs.close(); } void svg::drawCircle(int x, int y, int rad, std::string color, int width) { if (width > 0) // 線幅が指定されていれば輪郭線を描画する (draw only contour for non-zero width) ofs << "<circle cx='" << x << "' cy='" << y << "' r='" << rad << "' stroke='" << color << "' stroke-width='" << width << "' fill='none' />"; else // 線幅が指定されていないか、値が0以下であれば、円の内部を塗りつぶす (fill inside circle) ofs << "<circle cx='" << x << "' cy='" << y << "' r='" << rad << "' fill='" << color << "' />"; ofs << std::endl; // 改行 }
試したこと
親の呼び出し方が間違っていないか確かめたのですがわかりませんでした。
補足情報(FW/ツールのバージョンなど)
VisualStudio2019を使っています。
(書き方)使い方が違いますよ。
"<code>"で出てくる奴の中に書きましょう。
また、メンバ関数の定義はありますが、クラス定義がありません。
ヘッダファイルも提示しましょう。
学校の課題は学校の先生に聞きましょう。何か聞けない事情があるのでしょうか。もし自分の力で解いて下さいという指示があるのなら今されていることは不正行為だと思いますよ。
回答1件
あなたの回答
tips
プレビュー