質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2013閲覧

c++ インスタンスが生成できない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/07/01 05:17

編集2019/07/01 05:42

前提・実現したいこと

学校の課題で円を描くプログラムを作っています。

発生している問題・エラーメッセージ

例外がスローされました (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を使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2019/07/01 05:23 編集

(書き方)使い方が違いますよ。 "<code>"で出てくる奴の中に書きましょう。 また、メンバ関数の定義はありますが、クラス定義がありません。 ヘッダファイルも提示しましょう。
退会済みユーザー

退会済みユーザー

2019/07/01 05:30

学校の課題は学校の先生に聞きましょう。何か聞けない事情があるのでしょうか。もし自分の力で解いて下さいという指示があるのなら今されていることは不正行為だと思いますよ。
guest

回答1

0

ベストアンサー

こんにちは。

LineCircle::LineCircle(int cx, int cy, int r, string c1, int w) : ColorCircle(cx, cy, r, color)

ベースクラスのコンストラクタに未初期化の値(color変数)を渡しているのが原因です。

投稿2019/07/01 08:18

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/01 08:25

本当にありがとうございます。 おかげで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問