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 次