【C++入門】抽象化(Abstraction)の基本とクラスを使った実装方法
抽象化(Abstraction)とは
抽象化とは、外部に対しては必要な情報だけを提供し、背後にある複雑な処理や詳細な実装は隠すという考え方です。プログラミングにおいては、「インターフェースと実装の分離」という原則に基づいて設計を行います。
C++における抽象化の実現方法
C++ではクラスを使うことで抽象化を実現できます。クラスは、外部からデータを操作するためのpublicメソッドを提供し、それ以外のメンバ変数や内部構造はprivateとして隠蔽します。
これにより、利用者はクラスの内部がどのように実装されているかを知らなくても、公開されたメソッドを通じて必要な機能を自由に利用できるようになります。
サンプルプログラム
以下は、C++でクラスを使用して抽象化を実装するプログラムの例です。長方形の縦・横の値を設定し、面積を計算して表示します。
#include <iostream>
using namespace std;
class Abstraction {
private:
int length, breadth;
public:
void setValues(int l, int b) {
length = l;
breadth = b;
}
void calcArea() {
cout<<"Length = " << length << endl;
cout<<"Breadth = " << breadth << endl;
cout<<"Area = " << length*breadth << endl;
}
};
int main() {
Abstraction obj;
obj.setValues(5, 20);
obj.calcArea();
return 0;
}実行結果
Length = 5 Breadth = 20 Area = 100
コードの解説
上記のプログラムでは、Abstractionクラスのlengthとbreadthはprivate変数として宣言されているため、クラス外から直接アクセスすることはできません。一方で、これらの変数に値を設定するsetValues()と、lengthとbreadthを掛け合わせて面積を計算・表示するcalcArea()は、public関数として外部に公開されています。まさにこの構造こそが、抽象化の典型的な形です。該当するコード部分は以下の通りです。
class Abstraction {
private:
int length, breadth;
public:
void setValues(int l, int b) {
length = l;
breadth = b;
}
void calcArea() {
cout<<"Length = " << length << endl;
cout<<"Breadth = " << breadth << endl;
cout<<"Area = " << length*breadth << endl;
}
};main()関数では、まずAbstraction型のオブジェクトobjを生成します。続いてsetValues()を引数5と20で呼び出して値を設定し、最後にcalcArea()を使って設定値と面積を表示しています。該当するコード部分は以下の通りです。
Abstraction obj; obj.setValues(5, 20); obj.calcArea();
抽象化のメリット
- 内部実装を変更してもインターフェースが同じであれば、利用者側のコードを修正する必要がない
- 不要な詳細が隠されるため、コードがシンプルになり可読性が向上する
- privateメンバによるデータ隠蔽により、不正なアクセスや意図しない変更を防止できる
- 大規模開発でもモジュール間の依存を減らせ、保守性・拡張性が高まる
まとめ
C++の抽象化は、アクセス指定子(private / public)を活用してインターフェースと実装を分離することで実現します。利用者に必要な操作だけを公開し、実装の詳細を隠すことで、安全で保守しやすいプログラムを構築できます。
-
二分木で屈曲数が最大となるパスの長さを求めるC++プログラム
本記事では、二分木が与えられたときに、屈曲数が最大となるパスを求める問題を解いていきます。ここで「屈曲(ベンド)」とは、パスの進行方向が左から右へ、または右から左へと切り替わる箇所のことです。具体例を見てみましょう。入力 −出力 −6この方法では、木を走査しながら直前の移動方向を記録していきます。方向が変化した時点で屈曲数を加算し、最終的にその最大値を求めます。解法のアプローチこのアプローチでは、すべてのパスを辿り、各パスにおける屈曲の総数を計算します。葉ノードに到達した時点で、これまでの屈曲数が現在の最大値を上回っていれば、答えとパスの長さを新しい値に更新します。C++による実装例#incl
-
C++で連結リストのループ(循環部分)の長さを求める方法
この記事では、ループ(循環)を含む可能性がある連結リストが与えられたときに、そのループの長さ(ループ内のノード数)を求める方法を解説します。 問題の概要 与えられた連結リストにループが存在する場合は、ループを構成するノードの数を数えて返します。ループが存在しない場合は -1 を返します。 具体例を見てみましょう。 入力: 連結リスト:1 → 2 → 3 → 4 → 5 → 6 → 7 → 2(ノード2に戻る) 出力: 6 この例では、ノード7の次がノード2に接続されており、ノード2からノード7までの6個のノードがループを形成しています。 解決アプローチ:フロイドの循環検出法 まず、連結リス