回答編集履歴

2

修正

2020/05/06 14:16

投稿

tiitoi
tiitoi

スコア21953

test CHANGED
@@ -70,11 +70,13 @@
70
70
 
71
71
  char *pName;
72
72
 
73
-
73
+
74
74
 
75
75
  public:
76
76
 
77
77
  Car(const char *pN, int n, double g);
78
+
79
+ //デストラクタ
78
80
 
79
81
  ~Car();
80
82
 
@@ -102,7 +104,7 @@
102
104
 
103
105
  gas = g;
104
106
 
105
- cout << pName << "aa" << endl;
107
+ cout << pName << "を作成しました。" << endl;
106
108
 
107
109
  }
108
110
 
@@ -112,7 +114,7 @@
112
114
 
113
115
  {
114
116
 
115
- cout << pName << "bb" << endl;
117
+ cout << pName << "を破棄します。" << endl;
116
118
 
117
119
  delete[] pName;
118
120
 
@@ -124,11 +126,11 @@
124
126
 
125
127
  {
126
128
 
127
- cout << "n = " << num << " xx" << endl;
129
+ cout << "車のナンバーは" << num << "です。" << endl;
128
130
 
129
- cout << "gas = " << gas << " xx" << endl;
131
+ cout << "ガソリン量は" << gas << "です。" << endl;
130
132
 
131
- cout << "pName = " << pName << " xx" << endl;
133
+ cout << "名前は" << pName << "です。" << endl;
132
134
 
133
135
  }
134
136
 
@@ -142,10 +144,12 @@
142
144
 
143
145
  car1.show();
144
146
 
145
-
147
+
146
148
 
147
149
  return 0;
148
150
 
149
151
  }
150
152
 
153
+
154
+
151
155
  ```

1

修正

2020/05/06 14:16

投稿

tiitoi
tiitoi

スコア21953

test CHANGED
@@ -17,3 +17,135 @@
17
17
  + Car(const char *pN, int n, double g)
18
18
 
19
19
  ```
20
+
21
+
22
+
23
+ 追記: C++11 だと思っていたのですが、C++03 では、文字列リテラルを char* に変換するのが許可されているので、この点は変更しなくても動きますね。
24
+
25
+
26
+
27
+ ## 追記
28
+
29
+
30
+
31
+ Warning の内容はより安全な関数 strcpy_s() を使ってくださいという内容です。
32
+
33
+ strcpy との違いはコピーする長さを指定する必要がある点です。
34
+
35
+
36
+
37
+ ```diff
38
+
39
+ - strcpy(pName, pN);
40
+
41
+ + strcpy_s(pName, strlen(pN) + 1, pN);
42
+
43
+ ```
44
+
45
+
46
+
47
+ ## 修正後のコード
48
+
49
+
50
+
51
+ ```cpp
52
+
53
+ #include <iostream>
54
+
55
+ #include <string>
56
+
57
+ using namespace std;
58
+
59
+
60
+
61
+ class Car
62
+
63
+ {
64
+
65
+ private:
66
+
67
+ int num;
68
+
69
+ double gas;
70
+
71
+ char *pName;
72
+
73
+
74
+
75
+ public:
76
+
77
+ Car(const char *pN, int n, double g);
78
+
79
+ ~Car();
80
+
81
+ void show();
82
+
83
+ };
84
+
85
+
86
+
87
+ Car::Car(const char *pN, int n, double g)
88
+
89
+ {
90
+
91
+ //コンストラクタ内で動的にメモリ確保
92
+
93
+ //strlen(pN) pNの中身の文字列のNULLより前の文字数を数える
94
+
95
+ pName = new char[strlen(pN) + 1];
96
+
97
+ //strcpy(pName, pN) pNameにpNの中身の文字列をコピーする
98
+
99
+ strcpy_s(pName, strlen(pN) + 1, pN);
100
+
101
+ num = n;
102
+
103
+ gas = g;
104
+
105
+ cout << pName << "aa" << endl;
106
+
107
+ }
108
+
109
+
110
+
111
+ Car::~Car()
112
+
113
+ {
114
+
115
+ cout << pName << "bb" << endl;
116
+
117
+ delete[] pName;
118
+
119
+ }
120
+
121
+
122
+
123
+ void Car::show()
124
+
125
+ {
126
+
127
+ cout << "n = " << num << " xx" << endl;
128
+
129
+ cout << "gas = " << gas << " xx" << endl;
130
+
131
+ cout << "pName = " << pName << " xx" << endl;
132
+
133
+ }
134
+
135
+
136
+
137
+ int main()
138
+
139
+ {
140
+
141
+ Car car1("mycar", 1234, 25.5);
142
+
143
+ car1.show();
144
+
145
+
146
+
147
+ return 0;
148
+
149
+ }
150
+
151
+ ```