0から始めるVisualStudio2022:ソフト開発塾

今回は、クラスを作ってみようと思います。
いつものように
『ファイル』『追加』『新しいプロジェクト』
C++の空のプロジェクトを選んで
sample007のプロジェクトを作成
忘れないうちに、
sample007を『プロジェクト』『スタートアッププロジェクトに設定』で変更して
main用のファイルを作成
『プロジェクト』『新しい項目の追加』で、
sample007.cppを作成します。
で、今回はクラスなので
プロジェクト に クラスの追加 があるので、これを使ってみる
『プロジェクト』『クラスの追加』
が、表示された。
クラス名は、一般に先頭文字をCにするらしいので、
C_sample007 と、入力
なんと、クラス名に C_sample007 と、入力すると .hファイル .cppファイル に勝手に入力されるじゃありませんか。
ま、いいか。このままOKで。
すると、C_sample007.h を、開いて
#pragma once
class C_sample007
{
};

って、ソース?ヘッダー?が、編集状態で存在。
とりあえず、保管
で、次に
プロジェクト の クラスの追加 の下に 「クラス ウィザード」ってのがあるので起動してみる。
『プロジェクト』『クラス ウィザード』
とりあえず、プライベートでメンバ変数を追加
m_key m_data1 m_data2
m_data2 は、int で
m_key と m_data1 は、char * とする。






次に、メソッドは、メンバ変数に対するgetとset
m_keyに対しては、get_key set_key
m_data1に対しては、get_data1 set_data1
m_data2に対しては、get_data2 set_data2
を、設定
さて、この画面に、入力するぞ。
まずは、関数名に get_key
戻り値の型に char *
アクセスは、public のままでOK
.cppファイルは、 C_sample007.cpp でいいだろう。
続けて
続けて
続けて
続けて
続けて
続けて
続けて
続けて
続けて
続けて
続けて
ふうう、やっと終わった。
ソースを見るかぁ。

C_sample007.h
#pragma once
class C_sample007
{
	int m_data2;
	char* m_key;
	char* m_data1;
public:
	char* get_key();
	void set_key(char* mp_key);
	char* get_data1();
	void set_data1(char* mp_data1);
	int get_data2();
	void set_data2(int mp_data2);
};

C_sample007.cpp
#include "C_sample007.h"


char* C_sample007::get_key()
{
    // TODO: ここに実装コードを追加します.
    return nullptr;
}


void C_sample007::set_key(char* mp_key)
{
    // TODO: ここに実装コードを追加します.
}


char* C_sample007::get_data1()
{
    // TODO: ここに実装コードを追加します.
    return nullptr;
}


void C_sample007::set_data1(char* mp_data1)
{
    // TODO: ここに実装コードを追加します.
}


int C_sample007::get_data2()
{
    // TODO: ここに実装コードを追加します.
    return 0;
}


void C_sample007::set_data2(int mp_data2)
{
    // TODO: ここに実装コードを追加します.
}

と、出来上がる。
C_sample007.h は、このままで
C_sample007.cpp を、修正する。
#include "C_sample007.h"
char* C_sample007::get_key(){
    return m_key;
}
void C_sample007::set_key(char* mp_key){
    m_key = mp_key;
}
char* C_sample007::get_data1(){
    return m_data1;
}
void C_sample007::set_data1(char* mp_data1){
    m_data1 = mp_data1;
}
int C_sample007::get_data2(){
    return m_data2;
}
void C_sample007::set_data2(int mp_data2){
    m_data2 = mp_data2;
}
って、感じだけど
クラス ウィザード
使うより、直接コーディングしたほうが、早くない?
って、ことでC_sample007sは、クラス ウィザードを使用しないでコーディングに挑戦!!
まずは、C_sample007s.h を作成
『プロジェクト』『新しい項目の追加』で、
次は、C_sample007s.cpp を作成
『プロジェクト』『新しい項目の追加』で、
とやっても、
『プロジェクト』『クラスの追加』
大差なし。
C_sample007s.h は
#pragma once
class C_sample007s{
private:
	C_sample007* m_007;
	C_sample007s* m_next;
public:
	C_sample007s();

	int additem(char* mp_key, char* mp_data1,int mp_data2);
	int add(char* mp_key, C_sample007* mp_007);
	int remove(char* mp_key);
	C_sample007* items(char* mp_key);
	C_sample007* get_007();
	C_sample007s* get_next();
private:
	C_sample007* find(char* mp_key);
	C_sample007s* notfind(char* mp_key);
};
C_sample007s.cpp は
#include "C_sample007.h"
#include "C_sample007s.h"
#include <stdio.h>
#include <string.h>
//
C_sample007s::C_sample007s() {
	m_007 = NULL;
	m_next = NULL;
}
//
C_sample007* C_sample007s::find(char* mp_key) {
	C_sample007s* ptr007s = this;
	while (ptr007s->m_next->m_next) {
		ptr007s = ptr007s->m_next;
		if (strcmp(ptr007s->m_007->get_key(), mp_key) == 0) {
			return ptr007s->m_007;
		}
	}
	return NULL;
}
//
C_sample007s* C_sample007s::notfind(char* mp_key) {
	C_sample007s* ptr007s = this;
	while (ptr007s->m_next->m_next) {
		ptr007s = ptr007s->m_next;
		if (strcmp(ptr007s->m_007->get_key(), mp_key) == 0) {
			return NULL;
		}
	}
	return ptr007s;
}
//
int C_sample007s::add(char* mp_key, C_sample007* mp_007) {
	C_sample007s* ptr007s = this;
	while (ptr007s->m_next) {
		ptr007s = ptr007s->m_next;
		if (strcmp(ptr007s->m_007->get_key(), mp_key) == 0) {
			return 0;
		}
	}
	ptr007s->m_next = new C_sample007s;
	ptr007s = ptr007s->m_next;
	ptr007s->m_007 = mp_007;
	return 1;
}
//
int C_sample007s::additem(char* mp_key, char* mp_data1,int mp_data2) {
	C_sample007s* ptr007s = this;
	while (ptr007s->m_next) {
		ptr007s = ptr007s->m_next;
		if (strcmp(ptr007s->m_007->get_key(), mp_key) == 0) {
			return 0;
		}
	}
	ptr007s->m_next = new C_sample007s;
	ptr007s = ptr007s->m_next;
	C_sample007* ptr = new C_sample007;
	ptr007s->m_007 = ptr;
	ptr->set_key(mp_key);
	ptr->set_data1(mp_data1);
	ptr->set_data2(mp_data2);
	return 1;
}
//
C_sample007* C_sample007s::items(char* mp_key) {
	return this->find(mp_key);
}
//
int C_sample007s::remove(char* mp_key) {
	C_sample007s* ptr007s_old;
	C_sample007s* ptr007s = this;
	while (ptr007s->m_next->m_next) {
		ptr007s_old = ptr007s;
		ptr007s = ptr007s->m_next;
		if (strcmp(ptr007s->m_007->get_key(), mp_key) == 0) {
			ptr007s_old->m_next = ptr007s->m_next;
			return 1;
		}
	}
	return 0;
}
//
C_sample007* C_sample007s::get_007() {
	return this->m_007;
}
//
C_sample007s* C_sample007s::get_next() {
	return this->m_next;
}
で、メインの sample007.cpp は、
#include "C_sample007.h"
#include "C_sample007s.h"
#include <stdio.h>

int main() {
	// データの保管
	C_sample007s mm_data;
	mm_data.additem((char*)"0001", (char*)"AAAAA A1A1A1",9001);
	mm_data.additem((char*)"0002", (char*)"BBBBB B2B2B2",8002);
	mm_data.additem((char*)"0003", (char*)"CCCCC C3C3C3",7003);
	mm_data.additem((char*)"0004", (char*)"DDDDD D4D4D4",6004);
	mm_data.additem((char*)"0005", (char*)"EEEEE E5E5E5",5005);
	// 指定のKEYデータの表示
	C_sample007* mm_ptr_007;
	mm_ptr_007 = mm_data.items((char*)"0003");
	printf("[%s][%s][%d]\n", mm_ptr_007->get_key(), mm_ptr_007->get_data1(), mm_ptr_007->get_data2());
	// すべてのデータ表示		
	C_sample007s* mm_ptr_007s;
	mm_ptr_007s = &mm_data;
	for (; mm_ptr_007s->get_next();) {
		mm_ptr_007s = mm_ptr_007s->get_next();
		mm_ptr_007 = mm_ptr_007s->get_007();
		printf("[%s][%s][%d]\n", mm_ptr_007->get_key(), mm_ptr_007->get_data1(), mm_ptr_007->get_data2());
	}
	// 重複するKEYデータの保管
	int rc = mm_data.additem((char*)"0003", (char*)"XXXXXX X9X9X9", 9900);
	if (rc) {
		printf("保管成功\n");
	}
	else {
		printf("保管失敗\n");
	}
	// すべてのデータ表示		
	mm_ptr_007s = &mm_data;
	for (; mm_ptr_007s->get_next();) {
		mm_ptr_007s = mm_ptr_007s->get_next();
		mm_ptr_007 = mm_ptr_007s->get_007();
		printf("[%s][%s][%d]\n", mm_ptr_007->get_key(), mm_ptr_007->get_data1(), mm_ptr_007->get_data2());
	}
	// KEYデータの削除
	rc = mm_data.remove((char*)"0003");
	if (rc) {
		printf("削除成功\n");
	}
	else {
		printf("削除失敗\n");
	}
	// すべてのデータ表示		
	mm_ptr_007s = &mm_data;
	for (; mm_ptr_007s->get_next();) {
		mm_ptr_007s = mm_ptr_007s->get_next();
		mm_ptr_007 = mm_ptr_007s->get_007();
		printf("[%s][%s][%d]\n", mm_ptr_007->get_key(), mm_ptr_007->get_data1(), mm_ptr_007->get_data2());
	}
	// 失敗データの保管
	rc = mm_data.additem((char*)"0003", (char*)"XXXXXX X9X9X9",9900);
	if (rc) {
		printf("保管成功\n");
	}
	else {
		printf("保管失敗\n");
	}
	// すべてのデータ表示		
	mm_ptr_007s = &mm_data;
	for (; mm_ptr_007s->get_next();) {
		mm_ptr_007s = mm_ptr_007s->get_next();
		mm_ptr_007 = mm_ptr_007s->get_007();
		printf("[%s][%s][%d]\n", mm_ptr_007->get_key(), mm_ptr_007->get_data1(), mm_ptr_007->get_data2());
	}

}
実行結果
[0003][CCCCC C3C3C3][7003]
[0001][AAAAA A1A1A1][9001]
[0002][BBBBB B2B2B2][8002]
[0003][CCCCC C3C3C3][7003]
[0004][DDDDD D4D4D4][6004]
[0005][EEEEE E5E5E5][5005]
保管失敗
[0001][AAAAA A1A1A1][9001]
[0002][BBBBB B2B2B2][8002]
[0003][CCCCC C3C3C3][7003]
[0004][DDDDD D4D4D4][6004]
[0005][EEEEE E5E5E5][5005]
削除成功
[0001][AAAAA A1A1A1][9001]
[0002][BBBBB B2B2B2][8002]
[0004][DDDDD D4D4D4][6004]
[0005][EEEEE E5E5E5][5005]
保管成功
[0001][AAAAA A1A1A1][9001]
[0002][BBBBB B2B2B2][8002]
[0004][DDDDD D4D4D4][6004]
[0005][EEEEE E5E5E5][5005]
[0003][XXXXXX X9X9X9][9900]
と、なりました。
本来vector や list を使うべき!!
おまけ


Top