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

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

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

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

Q&A

解決済

3回答

1112閲覧

テンプレートクラスの二つのメンバ変数にメモリの動的割り当てをするのがうまくいきません。

TKG3782

総合スコア6

C++

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

0グッド

0クリップ

投稿2020/05/17 04:50

インスタンス作成時に(電話番号,"名前の文字リテラル")を引数にしてメンバ変数を初期化するクラスを作成したのですが、以下のようなエラーが出てしまい、ググってみてもいまいち理解ができません。
どなたかわかる方がいましたら教えてくださいませ。
c++study.cpp:35:20: error: no matching constructor for initialization of
'phones<long>'
phones < long >a(10192020,"miffy");
^ ~~~~~~~~~~~~~~~~
c++study.cpp:9:5: note: candidate constructor not viable: no known conversion
from 'const char [6]' to 'const char' for 2nd argument
phones( T f,const char c)
^
c++study.cpp:5:7: note: candidate constructor (the implicit copy constructor)
not viable: requires 1 argument, but 2 were provided
class phones{
^
c++study.cpp:36:20: error: no matching constructor for initialization of
'phones<long>'
phones < long >b(19585,"john");
^ ~~~~~~~~~~~~
c++study.cpp:9:5: note: candidate constructor not viable: no known conversion
from 'const char [5]' to 'const char' for 2nd argument
phones( T f,const char c)

c++

1#include <iostream> 2using namespace std; 3 4template <class T> 5class phones{ 6 T *p; 7 char *ch; 8public: 9 phones( T f,const char c) 10 { 11 cout << "コンストラクタ起動\n"; 12 p = new T; 13 ch = new char; 14 15 *p = f; 16 *ch = c; 17 } 18 ~phones() 19 { 20 cout<<"デストラクタ起動\n"; 21 delete p; 22 delete ch; 23 } 24 25 void show(){cout <<"電話番号は:"<< *p << "\n"; 26 cout << "名前は:" << *ch << "\n"; 27 cout << "show起動\n"; 28 } 29 30}; 31 32 33int main() 34{ 35 phones < long >a(10192020,"miffy"); 36 phones < long >b(19585,"john"); 37 a.show(); 38 b.show(); 39 return 0; 40 41} 42 43 44

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

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

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

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

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

guest

回答3

0

ベストアンサー

名前の表示は

cpp

1//cout << "名前は:" << *ch << "\n"; ではなく 2cout << "名前は:" << ch << "\n";

とすると出力されるかなと思います。
あと配列はdeleteの方法がdeleteではなくdelete[]になります。

投稿2020/05/17 05:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

そもそもnew/deleteを書くべきではありません。代わりにスマートポインタを利用してください。また、そのうち分かるようになると思いますがさしあたり現在はおまじないとしてデストラクタにはnoexcept指定をする習慣をつけておきましょう。(当然例外を投げたらダメ)

cpp

1#include <iostream> 2#include <memory> 3#include <cstring> 4using std::cout; 5 6template <class T> 7class phones{ 8 std::unique_ptr<T> p; 9 std::unique_ptr<char[]> ch; 10public: 11 phones( T f,const char* c) : p(std::make_unique<T>(f)), ch() 12 { 13 cout << "コンストラクタ起動\n"; 14 const auto len = std::strlen(c); 15 ch = std::make_unique<char[]>(len + 1); 16 std::memcpy(ch.get(), c, len + 1); 17 } 18 ~phones() noexcept 19 { 20 cout<<"デストラクタ起動\n"; 21 } 22 23 void show(){cout <<"電話番号は:"<< *p << "\n"; 24 cout << "名前は:" << ch.get() << "\n"; 25 cout << "show起動\n"; 26 } 27}; 28 29 30int main() 31{ 32 phones < long >a(10192020,"miffy"); 33 phones < long >b(19585,"john"); 34 a.show(); 35 b.show(); 36 cout << std::flush; 37 return 0; 38}

https://wandbox.org/permlink/s2PW85KQXwNxXRZc

投稿2020/05/17 05:42

yumetodo

総合スコア5852

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

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

0

イメージ説明
画像のように、p の動的割り当てを配列にし、chにはstrcpy()を用いたところ、コンパイルはうまくいきましたが、実行結果が

コンストラクタ起動
コンストラクタ起動
電話番号は:10192020
名前は:m
show起動
電話番号は:19585
名前は:j
show起動
デストラクタ起動
デストラクタ起動

となり、名前がうまく表示できません。

追記 
すみません、修正したのは
p = new T [100];
としたのではなく、
ch = new char [100];
です

投稿2020/05/17 05:22

編集2020/05/17 05:27
TKG3782

総合スコア6

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

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

TKG3782

2020/05/17 05:30

ch = new char [100]を ch = (char *) malloc(100)としても、結果は変わりませんでした。
TKG3782

2020/05/17 05:32

27行目の cout << "名前は:" << *ch << "\n"; を cout << "名前は:" << ch << "\n"; としたら求めていた結果になりました。 char型ポインタの使い方がよくわかっていなかったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問