マンガでよめる痔のこと・薬のこと

//test.cpp
#include<iostream>
#include<string>

class test {

string hoge;

public:
test(string str);
void method() const;
}

14行目  test::test(string str) : test(hoge){}

void test::method() const {
std::cout << "test" << std::endl;
}

int main() {

string s;
std::cout << "名前を入力してください。" << std::endl;
std::cin >> s;
test aaa(s);
aaa.method();
}

コンパイルしようとすると下記エラーになります。

エラー E2303 test.cpp 7: 型名が必要
エラー E2139 test.cpp 7: 宣言に ; がない
エラー E2293 test.cpp 10: ) が必要
エラー E2147 test.cpp 14: 引数宣言は 'string' で始められない
エラー E2111 test.cpp 14: ここでは型 'test' は定義できない
エラー E2136 test.cpp 14: コンストラクタには戻り型は指定できない
エラー E2316 test.cpp 14: 'test::test(int)' は 'test' のメンバーではない
エラー E2451 test.cpp 22: 未定義のシンボル string(関数 main() )
エラー E2379 test.cpp 22: ステートメントにセミコロン(;)がない(関数 main() )
エラー E2451 test.cpp 24: 未定義のシンボル s(関数 main() )
*** 10 errors in Compile ***

■1.型名が必要
→string hoge;と宣言してる箇所でエラー発生。
…stringと宣言してるのになぜでしょうか…
■2.宣言に";"がない
→string hoge;と宣言してる箇所でエラー発生。
…";"つけてるのですが…
■3.")"が必要
→test(string str);の行でエラー発生。
…")"はどこで必要なのでしょうか
■4.引数宣言はstringでははじめられない
→test::test(string str) : test(hoge){}の行でエラー発生。
…C++って引数をstringで受け取れない…?どういうことでしょうか

などなど疑問がいっぱいあるのですが、どこが間違っているのかよくわかりません…ご指導よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

C++のstringは、正しくはstd::stringと書きます。


std::というのは、標準の名前空間のことで端的に言えば「標準の」を意味します。
# 一部の古いコンパイラはstd::がいらないものもあります。
# また、using namespaceというstd::を明記しなくてもいい記法があり、
# 入門書ではお手軽に使っていることがありますが、
# 基本的はヘッダでは使わない方が良い方法なので、std::と書いた方が安全です。
    • good
    • 0
この回答へのお礼

とてもわかりやすい解説ありがとうございました。
訂正してコンパイルするとうまくいきました。
また何か機会がありましたらご指導宜しくお願いします。

お礼日時:2007/07/08 03:12

//bcc32で一応コンパイル通った


//test.cpp
//test.cpp
#include<iostream>
#include<string>

class test{

private:
std::string hoge;



public:

test(std::string& str) {
hoge = str;
}

void method() const{
std::cout << hoge << std::endl;
std::cout << "methodメソッドが呼び出されました" << std::endl;

}

};

void main(){

std::string s;
std::cout << "名前を入力してください。" << std::endl;
std::cin >> s;
test aaa(s);
aaa.method();

}
    • good
    • 0
この回答へのお礼

具体的なソースを提示していただいてとても助かりました。
ありがとうございました。

お礼日時:2007/07/08 03:11

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++ Builderでユニットの追加

趣味でプログラミングを行ってますCerapodaと申します。

Builderを使って1つのFormと1つのCpp,hファイルを使ったプログラミングならある程度のところまで出来ると思っているのですが
以前違うプロジェクトで作った関数を新たなプロジェクトで使おうとして
いちいちコピー&ペーストするのも大変なので
ひとつのユニット&ヘッダーファイルとしてインクルードして使いたいなと思いました。

そこで
http://www.osakac.ac.jp/labs/matsuura/japanese/program/C++Builder/Project/projectManyForm.htm
このページを参考にしてUnit1とUni2を作成し

Unit2に
double Analysis::Function(double val)
{
return(1.0-val);
}
の関数を追記。

Unit1のcppに
C.Function(0.5);
と書き加えたのですが

[リンカ エラー] 外部シンボル '_C' が未解決…
とエラーが表示されてしまいます。

どこに問題があるのか教えていただければ幸いです。
情報が足りない場合は、補足しますのでよろしくお願いします。
また、このような作業で参考になるサイト,URL等ありましたら教えていただけると幸いです。
よろしくお願いします。

趣味でプログラミングを行ってますCerapodaと申します。

Builderを使って1つのFormと1つのCpp,hファイルを使ったプログラミングならある程度のところまで出来ると思っているのですが
以前違うプロジェクトで作った関数を新たなプロジェクトで使おうとして
いちいちコピー&ペーストするのも大変なので
ひとつのユニット&ヘッダーファイルとしてインクルードして使いたいなと思いました。

そこで
http://www.osakac.ac.jp/labs/matsuura/japanese/program/C++Builder/Project/projectManyForm.htm
こ...続きを読む

Aベストアンサー

参考にしたサイトのソースをそのまま流用しているという前提ですが、それだと、そもそもAnalysis Cが定義されてませんね。不備のあるソースですよそれ。

とりあえず、Unit2.cppの末尾にでも

  Analysis C;

の一行を加えてみてください。

これでダメならあなたのお書きになったソースを全部提示してもらわないと判断がつきません。

といいますか、質問の際は最初からソースを提示してください。
文字制限に引っかかるときは、問題が発生する最小限のソースを抽出して。
回答者が他所のサイトをわざわざ開かなくても回答できるように。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q”wchar_t*型は渡せない”というエラー

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupported)GetProcAddress(hSPI, "IsSupported");

このように宣言していて、


typedef int __stdcall (*ProcIsSupported)(LPSTR,DWORD);


このようなプログラムなのですが、解決方法を教えて頂けませんでしょうか?

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupport...続きを読む

Aベストアンサー

質問するには、もう少し情報があった方がいいでしょう。
既にある回答の情報から、C++ Builder のようですが、2009 or 2007 以降、ダイアログにある文字データの型が AnsiString から、UnicodeString に替わりました。
このため、c_str() をとっても、char * ではなく、wchar_t* が帰ってきます。

で、横着をするのなら、UnicodeString が AnsiString にキャスト可能であることを使って、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )

を、

if( IsSupported(static_cast<AnsiString>(OpenDialog->FileName).c_str(),theFile) != 0 )

と、一度 AnsiString にしてから、.c_str() をとると、char * が帰ってきます。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q「読み込み違反」が起きたときのデバッグ方法

たとえば、Metasequoiaさんのページにありますように、読み込み違反が発生しプログラムが停止したとき「”main.exe”のアドレスXXXXXXでYYYYYYに対する読み込み違反が発生しました。」などどいうメッセージが出ることがあります。

http://www.metaseq.net/metaseq/bbs.html

まれに、このアドレスをメモしておいて、報告してほしいという開発者さんを見かけます。例えば、上記Metasequoiaさんの場合もそうです。

例えば、VC++やBorland、GCCなどで開発している場合、このアドレスからいかにしてデバッグするのでしょうか?「私はこうしてる」などと言ったお話が聞ければと思い質問させていただきました。

よろしくお願いします。

Aベストアンサー

そういう情報を元にしたデバッグにはデバッガを使います。
VC++とかの統合環境ならデバッガを内蔵してるし、gccを使ってるならgdbで。

「アドレスXXXXXXで」の方の値は、実行している命令のアドレスを示しています。これは、同じプログラムであれば、ユーザー環境でも開発環境でもどこで実行しても同じになります。
ですから、開発側でデバッガを使うことで「どの関数のどの文を実行している時にエラーが発生したのか」がわかります。

「YYYYYYに対する読み込み違反」の方の値はデータアドレスなのですが、こちらは実行条件によって値が変わってきます。そのため、ユーザーの環境をそのまま開発環境に再現することはできません。
ですが、「00000000」とか「FFFFFFFF」とかの特徴的な値が出てきたとしたら、そこからコード上の問題を追及できる可能性はあります。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC++Builderで別Formから呼び出したFormを終了させるには

C++Builderで別Formから呼び出したFormを終了させるには
わかりにくくてすいませんが

Form1から Form2を呼び出し
そのForm2からForm1を終了させたいのですが
もちろんForm2も終了されてもかまいません
又はアプリケーションごと
すべて終了させてもかまいません

よろしくお願いいたします

Aベストアンサー

>Form1から Show()でForm2を立ち上げて
>そのForm2からClose()で
>Form1ごと閉じたかったのですが閉じれなかったので
>もちろん
>Form1 = new TForm1(this);
>Form1->Close();
>はしたのですが やり方がおかしかったのでしょうか?

 インスタンスとクラスの関係を理解しましょう。
Form2のインスタンス中でそんなことやったら、Form1の今表示されているウインドウ(に関連するメモリ)は宙に浮き、新しいウインドウが作られ、それを閉じる、というようなことをやっています。

 Form2にForm1を参照させて、Form1->Close();だけで閉じませんでした?
#「終了」は、Closeで良かったかいな??

QStringGridでの文字入力制限

C++BuilderでStringGridで、GoEditingプロパティをtrueに設定してセルの内容を編集するときに、数字のみ受付可能にするにはどうしたらいいでしょうか?よろしくお願いします。

Aベストアンサー

TStringGrid::OnGetEditMaskイベントが使えます。
仮に(1, 1)~(10,10)までのセルで入力を0~9999までの整数に制限したいのなら、

void __fastcall TForm1::StringGrid1GetEditMask(TObject *Sender,
  int ACol, int ARow, AnsiString &Value)
{
 if ( ACol >=1 && ACol <= 10 && ARow >=1 && ARow <= 10 )
  Value = "9999;0";
}

マスク文字列の詳細はヘルプでTEditMaskを検索参照してください。
かなり細かい指定が可能です。

Qエラー:浮動小数点の不正な使用

/*月ごとの平均気温・降水量を構造体の配列に格納した後、 */
/*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/

#include<stdio.h>
void main(void)
{
int i;
double total_kion, total_suiryo, av_kion, av_suiryo;
struct YEAR_DATA{
double kion[12];
double suiryo[12];
};

struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210},
{25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74},{6.2, 48}};

for(i=0 ; i<12 ; i++){
total_kion += data[i].kion;
total_suiryo += data[i].suiryo;
}

av_kion = total_kion / 12;
av_suiryo = total_suiryo /12;

printf("年間平均気温 %lf\n", av_kion);
printf("年間平均降水量 %lf\n", av_suiryo);
}

構造体のところを勉強しています。
上の問題を解いてみたのですが、for文の中の2行に「浮動小数点の不正な使用」というエラーが起こってしまい、答も違っています。
どこが間違っているのか、ご指摘お願いします。

/*月ごとの平均気温・降水量を構造体の配列に格納した後、 */
/*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/

#include<stdio.h>
void main(void)
{
int i;
double total_kion, total_suiryo, av_kion, av_suiryo;
struct YEAR_DATA{
double kion[12];
double suiryo[12];
};

struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210},
{25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74...続きを読む

Aベストアンサー

Visual C++ 2003 でコンパイルした結果
誤りは以下
struct YEAR_DATA{
double kion;
double suiryo;
};
total_kion=0.0;
total_suiryo =0.0;
年間平均気温 14.858333
年間平均降水量 131.166667

QC言語でのaccess violationについて

Microsoft Visual C++でプログラムを行っていたのですが、プログラムを実行すると、エラーが発生します。
そこでデバッグを行ったら、

ハンドルされていない例外は”アプリ名.exe”にあります
:0xC0000005:Access Violation。

というメッセージが出てきました。
ネットでAccess Violationについて調べたのですが、いまひとつ理解できません。
これはどういうことなのでしょうか?また、解決策をご教授願えないでしょうか?
初心者なので、可能な限り専門用語などを使わない、わかりやすい解説をしていただけると幸いです。お願いします。

Aベストアンサー

アクセス違反。システム自身の保護機能発動。
おそらくアクセスできないメモリにアクセスしてる。

どんなプログラムか不明ですが、
・char[]等: バッファの最後よりも後ろへ出力しようとしてる
・printf系: 書式指定箇所を埋めるのにパラメータが足りない
などが良く引っかかる点。

プログラムを晒せば、もっと的確なレスポンスが付くかもしれません


人気Q&Aランキング