質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

13763閲覧

C++ 引数付きのコンストラクタについて

saito.kaz

総合スコア76

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/01/21 07:54

編集2016/01/21 08:03

###前提・実現したいこと
引数つきのコンストラクタを追加したところエラーが起き、原因が分かりません。
すいません、勉強して一週間もたっていなくて、質問が投げやりな感じになってしまって申し訳ありませんが、回答お願い致します。

###発生している問題・エラーメッセージ
Phone.cpp:17:3: error: no matching function for call to 'strcpy'
strcpy(this->plan,*plan);
^~~~~~
/usr/include/string.h:129:14: note: candidate function not viable: no known conversion from 'char' to 'const char *restrict' for 2nd argument; remove *
extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
^
Phone.cpp:37:21: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
Phone p2(false, "p2","noraml");
^
1 warning and 1 error generated.
^
1 error generated.
###ソースコード

<メイン文> #include <iostream> #include <string.h> #include "Phone.h" using namespace std; Phone::Phone(){ plan = new char[100]; cout << "this is constrcuter "<< "\n"; this->i = false; strcpy(this->plan, "normal"); this->pInfo = "nokia"; } Phone::Phone(bool i, char* plan, string pInfo){ this->i = i; strcpy(this->plan,*plan); this->pInfo = "nokia"; } Phone::~Phone(){ } void Phone::ShowPhone(){ cout << " i = " << this->i << "\n"; cout << " plan = " << this->plan <<"\n"; cout << " pInfo = " << this->pInfo <<"\n"; } int main(){ cout << " main " <<"\n"; Phone p1; Phone p2(false, "p2","noraml"); p1.i = false; strcpy(p1.plan,"normal"); p1.pInfo = "nokia"; p1.ShowPhone(); return 0; } <ヘッダー文> #include <string.h> class Phone{ public: Phone(); Phone(bool i, char* plan, std::string pInfo); ~Phone(); bool i; char* plan; std::string pInfo; virtual void ShowPhone(); };

###補足情報(言語/FW/ツール等のバージョンなど)
paiza.io

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakuwaku

2016/01/21 08:00

えっと。。。質問はどこですか?
guest

回答1

0

ベストアンサー

エラーメッセージは必ず確認して、その意味を理解するように努めてください。

Phone.cpp:17:3: error: no matching function for call to 'strcpy'
strcpy(this->plan,*plan);

「no matching function」で、「関数が何かマッチしてないんだなぁ・・・」
「for call to 'strcpy'」 で、「strcpy の呼び出し方がまちがっているんだなぁ」

という感じで、だいたいで良いので意味をきちんと解釈するように努めてください。

「strcpy(this->plan,*plan);」というように、問題の箇所まで示してくれています。

次に興味を向けるのは、strcpy関数の定義です。
これは調べればわかると思います。

char *strcpy(char *s1, const char *s2);

このとおり、引数が char型ポインタを2つ受け入れ、char型ポインタを返却する形になってます。

そこで、問題の箇所は何がいけないのかを考えてください。

Phone::Phone(bool i, char* plan, string pInfo){ this->i = i; strcpy(this->plan,*plan); this->pInfo = "nokia"; }

ここのstrcpyの第二引数で与えているものが、定義どおりの型になってないのですが、わかりますか?

Phone::Phone(bool i, char* plan, string pInfo)

より、変数planは既に char型のポインタなのですよ・・・?

エラーメッセージの続きにも、以下のように書かれています。

/usr/include/string.h:129:14: note: candidate function not viable: no known conversion from 'char' to 'const char *restrict' for 2nd argument; remove * extern char *strcpy (char *restrict dest, const char *restrict src)

no known conversion from 'char' to 'const char *restrict' for 2nd argument; **remove ***

「第二引数の char から const char* への変換方法がわからない」と言っていますが、
そのあとの「remove *」・・・

このように、先ずは「エラーメッセージの意味を解釈しようとする」ことを心がけることは大切です。

投稿2016/01/21 08:30

Toyoshima

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito.kaz

2016/01/21 08:54

ありがとうございます。 *を削除したら解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問