ページ 11

クラスを配列を使って管理する

Posted: 2013年2月03日(日) 17:56
by icon01
クラスの作り方について質問があります。

三角形、長方形、円形の3つの面積を求めるプログラムをクラスを用いて作るのですが、途中まではできたものの、最後の「基底クラスの配列を用いて管理する」という条件がいまいちとっつきにくくて困っています。

例として、

コード:


for(int i = 0; i < 3; i++)
{
    cout << shape[i]->getname()<<"の面積は"
            << shape[i]->getariea() <<"です" << endl;
}
のように基底クラスのshapeに配列を持たせてやるらしいのですが、以下の私のコードにどう手を加えれば良いのか
、教えていただけないでしょうか。言葉足らずで申し訳ありませんがどうぞよろしくお願いいたします。

コード:


ヘッダー
#pragma once

//基底クラス
class shape
{
    public:

        virtual void getname(); //名前の表示

        virtual void getarea();  //演算結果
};

//三角形のクラス
class triangle:public shape
{
    private:

        float m_base;        //底辺
        float m_heght;      //高さ

    public:

        triangle(float base, float heght);

        void getname();
        void getarea();
};

//長方形のクラス
class rectangle:public shape
{
    private:

        float m_vertical;        //縦
        float m_horizontal;    //横

    public:
        rectangle(float verticl,float horizontal);

        void getname();
        void getarea();
};

//円形のクラス
class circle:public shape
{
    private:

        float m_radius;    //半径

    public:

        circle(float radius);

        void getname();
        void getarea();
};

cpp

#include"shape.h"
#include<iostream>

using namespace std;

triangle::triangle(float base, float heght)
{
    m_base = base;
    m_heght = heght;
}

rectangle::rectangle(float vertical,float horizontal)
{
    m_vertical = vertical;
    m_horizontal = horizontal;
}

circle::circle(float radius)
{
    m_radius = radius;
}

void shape::getarea()
{

}

void shape::getname()
{

}

//三角形の面積を求める
void triangle::getarea()
{
    float n;
	
    n = (m_base * m_heght)/2.0f;

    cout << n << endl;
}

//長方形の面積を求める
void rectangle::getarea()
{
    float n;

    n = m_vertical * m_horizontal;

    cout << n << endl;
}

//円の面積を求める
void circle::getarea()
{
    float n;

    n = (m_radius * m_radius) * 3.14f; //π = 3.14

    cout << n << endl;
}

void triangle::getname()
{
    cout << "三角形"  << endl;;
}

void rectangle::getname()
{
    cout << "長方形";
}

void circle::getname()
{
    cout << "円形";
}

int main(void)
{
    shape* p;
    //適当に数字をぶち込む
    triangle t(2.0f,6.0f);
    rectangle r(3.0f,3.0f);
    circle c(5.0f);

    //三角形
    p = &t;
    p->getname();
    p->getarea();

    //長方形
    p = &r;
    p->getname();
    p->getarea();

    //円
    p = &c;
    p->getname();
    p->getarea();

    system("pause>NUL");
    return 0;
}

Re: クラスを配列を使って管理する

Posted: 2013年2月03日(日) 18:10
by softya(ソフト屋)
getnameやgetareaが値を戻さない実装なので、まずそこからダメだと思います。そこを直しましょう。
あとクラスのインスタンスをnewで生成してみて下さい。

Re: クラスを配列を使って管理する

Posted: 2013年2月03日(日) 18:54
by ISLe
とりあえずmain関数をこんな感じに書き換えると何か見えてきませんか。

コード:

int main(void)
{
    shape *p[3];
    //適当に数字をぶち込む
    triangle t(2.0f,6.0f);
    rectangle r(3.0f,3.0f);
    circle c(5.0f);
 
    //三角形
    p[0] = &t;
    p[0]->getname();
    p[0]->getarea();
 
    //長方形
    p[1] = &r;
    p[1]->getname();
    p[1]->getarea();
 
    //円
    p[2] = &c;
    p[2]->getname();
    p[2]->getarea();
 
    system("pause>NUL");
    return 0;
}