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

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

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

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

Q&A

解決済

2回答

1974閲覧

(C++)カプセル化でchar型の値を取得したい

.RN01

総合スコア7

C++

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

0グッド

0クリップ

投稿2018/01/31 10:19

前提・実現したいこと

一週間で身につくC++言語の基本を参考に現在C++を勉強しています。
prob3-1.の問題でstringで宣言したcommentを取得したいのですが、char型はそのままreturnで返却できずほかの方法が思いつきません。

http://cpp-lang.sevendays-study.com/problem3.html

ソースコード3つ掲載します。

発生している問題・エラーメッセージ

data.cpp: メンバ関数 ‘char CData::getComment()’ 内: data.cpp:23:9: エラー: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char’ in return return comment;

該当のソースコード

C++

1// data.h 2#ifndef _CDATA_H_ 3#define _CDATA_H_ 4 5#include <iostream> 6#include <string> 7 8using namespace std; 9 10class CData 11{ 12private: 13 //メンバ変数number 14 int number; 15 //メンバ変数comment 16 string comment; 17public: 18 //初期化 19 void init(); 20 void setNumber(int num); 21 int getNumber(); 22 void setComment(string com); 23 char getComment(); 24}; 25 26#endif // _CDATA_H_ 27 28 29 30 31//data.cpp 32#include "data.h" 33#include <string> 34using namespace std; 35void CData::init() 36{ 37 number = 0; 38 comment = ""; 39} 40void CData::setNumber(int num) 41{ 42 number = num; 43} 44void CData::setComment(string com) 45{ 46 comment = com; 47} 48int CData::getNumber() 49{ 50 return number; 51} 52char CData::getComment() 53{ 54 return comment; 55} 56 57 58 59//main.cpp 60#include <iostream> 61#include "data.h" 62 63using namespace std; 64 65int main() 66{ 67 CData d; 68 d.init(); //パラメーターを初期化 69 d.setNumber(100); 70 d.setComment("Programming C++"); 71 cout << "number = " << d.getNumber() << " comment = " << d.getComment() << endl; 72 73 return 0; 74}

試したこと

C言語のポインタを使って解決しようと考えましたがうまくいかず手詰まりの状態です。

補足情報(FW/ツールのバージョンなど)

コンパイラはcygwinを使っています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

std::stringのインスタンスを返すのなら、素直に戻り値をstd::stringにすれば良いのでは。

C++

1std::string CData::getComment() { 2 return comment; 3}

ついでに

using namespace stdは、下手に使うと名前空間の利益を損ないます。
意味が良く分からないうちは使わない方が良いでしょう。
また、意味を理解して使うにしても、ヘッダには書かない方が良いです。

投稿2018/01/31 10:23

編集2018/01/31 13:27
LouiS0616

総合スコア35660

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

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

.RN01

2018/01/31 13:15

戻り値を変更してみてもエラーが出てしまいます。 data.cpp: メンバ関数 ‘char CData::getComment()’ 内: data.cpp:25:20: エラー: expected primary-expression before ‘;’ token return std::string; #include "data.h" #include <string> //using namespace std; void CData::init() { number = 0; comment = ""; } void CData::setNumber(int num) { number = num; } void CData::setComment(string com) { comment = com; } int CData::getNumber() { return number; } char CData::getComment() { return std::string; }
LouiS0616

2018/01/31 13:20

いえ、ですから、std::stringは型の一種です。 メンバ関数の戻り値の宣言をstringにして、commentをそのまま返せばいいです。
.RN01

2018/01/31 13:32

実行結果通りになりました。 using namespace stdが便利だと思って活用していましたが、そのような問題があるとは初めて知りました。 ありがとうございました。
guest

0

http://marycore.jp/prog/cpp/convert-string-to-char/

リターンする前にキャストするとよいと思います。


https://teratail.com/questions/25315

std::stringとcharの違いについての過去の質問。

投稿2018/01/31 10:48

編集2018/01/31 10:54
mkgrei

総合スコア8560

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

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

.RN01

2018/01/31 13:12

URLを参考にやってみましたが、実行結果が、 number = 100 comment = P のみしか表示されませんでした。 #include "data.h" #include <string> using namespace std; void CData::init() { number = 0; comment = ""; } void CData::setNumber(int num) { number = num; } void CData::setComment(string com) { comment = com; } int CData::getNumber() { return number; } char CData::getComment() { string str = comment; char *cstr = new char[str.size() + 1]; char_traits<char>::copy(cstr, str.c_str(), str.size() + 1); return *str.c_str(); delete[] cstr; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問