ページ 11

クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:31
by はんなり
クラス内でString型のオブジェクトを宣言したいのですが、
下記のようにするとエラーを出してしまいます。どうすれば良いでしょうか?
※ ソフトはVS2010を使用しています。

コード:

class a{
 void f(){
  printf(%f,k);
 }
protected:
 double k;
 std::string s;//←ここがエラー
};

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:33
by Rittai_3D
#include <string>
していますか?
エラーメッセージがわからないので勘です。

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:36
by みけCAT
はんなり さんが書きました:クラス内でString型のオブジェクトを宣言したいのですが、
下記のようにするとエラーを出してしまいます。
String型ではなく、C++の標準ライブラリのstd::string型でいいですか?
はんなり さんが書きました:どうすれば良いでしょうか?
適切にコードを補えばいいと思います。

コード:

#include <cstdio> // printfを利用するために追加
#include <string> // std::stringを利用するために追加

class a{
 void f(){
  printf("%f",k); // %fの前後に"を追加
 }
protected:
 double k;
 std::string s;//←ここがエラー
};

int main(){} // リンクエラーを防ぐために追加(コンパイルだけなら必要ない)
Wandboxで確認しました。

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:38
by みけCAT
ちゃんとString型のオブジェクトを宣言してみました。
ついでに不要な#includeを消しました。

コード:

// 不正なコードを消してコンパイルを通す
#define printf(a,b)

// String型が定義されていないので、適当に作成
class String {
};

class a{
 void f(){
  printf(%f,k);
 }
protected:
 double k;
 // 型名を修正
 String s;//←ここがエラー
};

int main(){} // リンクエラーを防ぐために追加(コンパイルだけなら必要ない)
Wandboxで確認

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:42
by みけCAT
もしくは、VS2010を使うのをやめて、素直にJavaで書けばいいです。

コード:

class A {
	private void f() {
		// これはできない気がするので、申し訳ないがコメントアウト
		//printf(%f,k);
	}
	protected double k;
	protected String s;
}

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月10日(水) 22:50
by はんなり
回答ありがとうございます。

あまり良くわからなかったのですが、ヘッダーにクラスを宣言していたのが原因のようでした。
.cpp内に移動したら問題なく動作しました。

ちなみにエラーは、
"error C2039: 'string' : 'std' のメンバーではありません。"
というものでした。

ありがとうございました。

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月12日(金) 00:29
by GRAM
はんなり さんが書きました:回答ありがとうございます。

あまり良くわからなかったのですが、ヘッダーにクラスを宣言していたのが原因のようでした。
.cpp内に移動したら問題なく動作しました。

ちなみにエラーは、
"error C2039: 'string' : 'std' のメンバーではありません。"
というものでした。

ありがとうございました。
おそらくヘッダーで#include <string>を最初にインクルードしてないからじゃないですかね?

コード:

class a{
 void f(){
  printf(%f,k);
 }
protected:
 double k;
 std::string s;//←ここより手前でstringの定義がいる.つまりヘッダファイルの一番最初に#include <string>と書いておけば多分大丈夫
};

Re: クラス内でのString型オブジェクトの宣言

Posted: 2015年6月12日(金) 18:56
by はんなり
そういえばヘッダーにはインクルードしてませんでした。
おかげで原因が分かりました。ありがとうございます!