秘密基地、どこに作った?

C++を勉強しています。
参考書(橋本麻奈さんの「やさしいC++」です。)を用いていますが、次のようなサンプルコードを入力、実行するとstrcpyとstrcatの部分に、エラーが出ました。
「オーバーロードされた関数 "strcpy_s" のインスタンスが引数リストと一致しません」や「strcat_s関数に 2 個の引数を指定できません」と表示されます。原因と解決法を教えてください。
また、参考書に書いてある程度には関数、オーバーロード、インスタンスについて学んだつもりなのですが、なぜstrcpy_s関数がオーバーロードされたと判断されたのか分かりません。
長文になりましたが、この2点についてご回答よろしくお願いします。

以下コードです

#include<iostream>
#include<cstring>
using namespace std;

class Car {
private:
int carnum;
double cargas;
char* pName;
public:
Car(char* pN, int n, double g);
Car(const Car& c);
~Car();
Car& operator=(const Car& c);
};


Car::Car(char* pN, int n, double g) {
pName = new char[strlen(pN) + 1];
strcpy_s(pName, pN); //←このような部分すべてでエラーが出ます。
carnum = n;
cargas = g;
cout << pName << "を作成しました\n";
}


Car::Car(const Car& c) {
cout << c.pName << "で初期化します\n";
pName = new char[strlen(c.pName) + strlen("のコピー1") + 1];
strcpy_s(pName, c.pName);
strcat_s(pName, "のコピー");
carnum = c.num;
cargas = c.gas;
}

(以下コード略)

A 回答 (5件)

https://oshiete.goo.ne.jp/qa/10058791.html
似たような壁にぶちあたっている人がいるようです。

テンプレート使った2引数のものは、第1引数が配列変数名でないと要素数が取れないんじゃないかと思いますが…。
動的確保したポインタだった場合、ポインタからではサイズが取得できないかと。

となると、テンプレートでも適用できないので、引数2つを受け取るstrcpy_s()のオーバーロードと……。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
まだまだ僕の知識に至らぬ点が多々あったようですね、、、
指摘してくださった点もふまえてやっていきたいと思います。
ありがとうございました

お礼日時:2017/11/13 17:19

4版のさいしょのところに「セキュリティの警告が出ることがある」という趣旨の文言が書かれています. だから, 「警告が出る」ことそのものは折り込み済みと考えるべきでしょう.



その上で機械的に置き換えてエラーになってるわけだから... まあ勉強になったと思う?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
そうですね、警告を覚悟の上でやっていきたいと思います。

お礼日時:2017/11/18 19:17

>質問文では最初に「strcpyとstrcatの部分に、エラーが出ました」って書いているにもかかわらず, プログラムには strcpy も strcat も出てきていないところに注目.



strcpy()/strcat()でコンパイルしたらstrcpy_s()/strcat_s()使え。
という警告(エラーだっけ?)が出たので、機械的に置換してみました。
って感じでしょうかね。

第5版では引数3つのパターンになっているようですし。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
指摘していただいた通りです、、、
まだまだ未熟もいいところですね、、、精進します
なんとか解決しました!

お礼日時:2017/11/13 21:16

4版でもこのプログラムではないんだよな.



質問文では最初に「strcpyとstrcatの部分に、エラーが出ました」って書いているにもかかわらず, プログラムには strcpy も strcat も出てきていないところに注目.
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
おっしゃる通りです、、、
なんとか解決しました!

お礼日時:2017/11/13 21:15

ソースコードは、間違っていませんか?



ここより、ソースコードをダウンロードしてみました。
http://mana.on.coocan.jp/yasac.html
の「セキュリティ強化版サンプルコード(第5版)

ダウンロードしたソースと質問にあったソースと異なります。
一度ダウンロードして、
 Sample3.cpp
YCCSample\15\Sample3.cpp
を確認してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
僕の使っている参考書は第4版でしたので、何かしら今のバージョンに対応できていなかったのかもしれませんね、、、
試してみます
ありがとうございました

お礼日時:2017/11/13 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A