初めて投稿させていただきました。
いまCとC++のプログラムの勉強をしています。Cは参考書1冊分くらいやり、
いまC++をやっているのですが、どうもC+の良さ(便利さ?)が解りません。
部分的には便利なところもあるな(関数の戻り値が2つ以上でもOKとか関数の
オーバロード、テンプレートなど)と感じるのですがクラスも問題をやっている
分には無理に使って使い方を覚えるような感じで、必要性が感じない?これなら
Cでやったほうがいいんじゃないかと感じてしまいます。実際に仕事についているわけじゃないのでそれほど大きいプログラムを組んで勉強しているわけじゃないので
すが、どちらが便利でしょう。CをやったあとなのでまだC++に慣れていないのかとも感じていますが・・・・。

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

A 回答 (3件)

プログラムの生産性から言えばC++だと思いますよ。


クラスでプログラムを組むのに慣れてしまうと、たまにCで組むとすごく不便を感じますし、、、。
WindowsでのプログラムならMFCは必要と思いますので、やっぱりC++に慣れた方がよいと思います。
大規模なアプリケーション作成にはC++で、より低レベルな(ハードよりの)ものはCで組むといった感じでしょうか。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
はやくC++になれるように勉強励みます。
やっぱり大規模にならないとクラスの便利さとかは
解らないのですね~。

お礼日時:2001/11/12 01:12

現実にCとC++の必要性はどうなの?ってゆうと、


必要性であればC++の方が断然あります。
特にWindowsのお仕事で見ればクラスやMFCを知っているだけで開発効率や実現性が全然違います。
⇒つまり会社にとって利益率も変わってきます。

でも正直な所、C++って難易度が高い為技術者が育つのに時間がかかるんですよね。
⇒なのでC++をこなせる人(使える人ではない)は人材的にも伸びていく人である事が多い…。

しかも仕事となると開発言語を選べない場合が多々あります。
C++の仕事があるんだけど、どう?とか。
JAVAで作ってよ。とかね。

なので学生のうちは必要性うんぬんではなくて、
いろいろな言語を試行錯誤した方がいいと思いますよ。
⇒別に完全に習得する必要はないのです。要は知っておく事。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはりみなさんC++のほうが・・という方が多いのですね。
実をいうと只今転職中(無職)なのでちょっとあせっているというか、いろんな言語を広く浅くやるより、1つの言語を徹底的に勉強したほうが、これから就職するときにいいのかなという疑問がわいたのでこのような質問をさせていただきました。
でもいろいろな言語を知っておいたほうがよさそうなので安心しました。ありがとうございます。

お礼日時:2001/11/14 01:16

個人的な感覚では、出来の良いクラスライブラリを使うとコーディングは数倍楽になります。

でも、出来の良いクラスを作るのは、Cでコーディングするよりも明らかに面倒です。
クラスを作り慣れていないと、考える時間ばかり増えてしまうのが原因だと思います。
自分で作ることも大事なのですが、STLなど、人の作ったものも、どんどん使ってみて下さい。使いやすいもの、使いにくいものを体験していくことで、自分なりのコーディングスタイルが固まってくるはずです。

一度作ったプログラムは、どんなに出来が悪くても、消さないで保存しておくようにします。そうすると、過去に作ったプログラムの一部を流用する事が増えてくるので、そういう時にもC++の良さが実感できると思います。
    • good
    • 0
この回答へのお礼

貴重なご意見ありがとうございます。
確かにクラスを作りなれていないので考える時間ばかりとられてしまってます。
プログラムはすべてとっておいてあるので、今度は人の作ったものも色々使ってみて勉強してみます。

お礼日時:2001/11/14 01:06

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

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

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

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

QC++ の typedef の 使い方の質問

C++のtypedefの使い方の質問ですが、typedefは、別名の定義として、知られていますが。
以下のソースの意味がよく読み取れないです。windows プログラミングとC++
が分かるかたがいれば、以下のソースの意味を教えていただきたいです。

よろしくお願いします。
typedef BOOL (WINAPI *AddAccessAllowedAceFn)(
PACL pAcl,
DWORD dwAceRevision,
DWORD AceFlags,
DWORD AccessMask,
PSID pSid
);

Aベストアンサー

関数ポインタの別名定義です。
「関数ポインタ typedef」をキーワードにWeb検索してみてください。
丁寧に解説されているサイトが見つかるでしょう。

QVisual C++ 6.0で作成したプログラムをVisual C++

Visual C++ 6.0で作成したプログラムをVisual C++ 2008で実行することはできるのでしょうか?

ビルドしてみるのですが、afxwin.hがないと表示されてしまいます。
自分でも検索してみたのですが、ダウンロードできる状況なのかも良く分かりませんでした。

2週間後にプレゼンがあるのですが、手持ちのパソコンにはVisual C++2008しかないため、6.0をインストール、と考えたのですがそれもできないようなので・・・

もし、実行できるのであればその方法をお手数ですが分かりやすく教えてくださるとうれしいです。

Aベストアンサー

ひょっとして Visual C++ Express Edition を使っているのでしょうか。

afxwin.h は MFC のヘッダーで、MFC は Visual C++ Express Edition では利用できません。
Visual Studio の Standard Edition 以上を購入するか、Visual C++ 6.0のプログラムをもとに .NET で作り直すかのどちらかですが、……前者は結構な出費となりますし、後者は 2 週間ではかなり難しいと思います。

QC++.NET の String型の使い方

初めて質問いたします。
C++ .NET 2005 Express Beta版を入手し、Windows Formsのプログラミングを勉強してます。

TextBoxのTextに値を変数で指定したいのですがどうすれば良いのかわかりません。

  textBox1->Text = "Test";
とダイレクトに値を指定すればできるのですが、

  #include <string>
  using namespace std;
   (省略)
  string str = "Test";
  textBox1->Text = str;
は、エラーになってしまいます。

C++標準のstringクラスではなく、.NETはStringクラスがあるようですが、これの使い方がMSDN等で調べているのですが分かりません。
分かりやすいURLなどありましたら教えていただけませんか。

Aベストアンサー

textBox1->Text = new String(str.c_str());
でいけるんじゃないかなあ。
試してないのでなんですが、
C++のstringクラスからは、c_str()で、いわゆるNULL終端文字列へのポインタが得られて
.NETのStringクラスは、NULL終端文字列でのコンストラクタがありますから。

QRS232cと通信が可能な、CまたはC++のプログラム

初めて投稿します。

現在卒業研究で、RS232cで接続された2次元センサ(カメラで対象物をトラッキングし、2次元座標データをPCに送る計測器)のデータをPC(OSはXP)で読み込もうとしています。
以下のサイトを見つけ、
http://7ujm.net/C++/Rs232c.h.html
ソースファイルとヘッダーファイルからなるプログラムをつくり(プログラムの変更点は最後に明記しました)
、VC++とBORLANDC++で試してみたのですが
VC++ではプロジェクトのビルド時に
「fatal error C1010: プリコンパイル済みのヘッダーの検索中に予期しないEOFを検出しました。」
とエラーが出てしまいます。
_tmain()関数の引数を無記入にしてみてもエラーの内容は変わりません
でした。

また、BORLANDC++ではコンパイル時に
「エラー E2268 RS232.cpp 11: 未定義の関数'printf'を呼び出した(関数 tmai())」
「エラー E2268 RS232.cpp 13: 未定義の関数'gethar'を呼び出した(関数 tmai())」
となってしまい、ヘッダーファイルのみをコンパイルしても
「エラー E2141 RS232c.h 10:宣言の構文エラー」
というエラーが生じてしまいます。

念のためこちらも
http://okwave.jp/qa733184.html
参考に、BORLANDの設定(bcc32.cfg ファイルの確認など、最初の設定)も確認しましたが、独習Cなどの教本に載っているプログラムでは問題なく動作します。

なお計測機器のボーレートは115200bps、ターミネータはcr(キャリッジリターン)のみで(lf(ラインフィード)が入ってもかまわない)、送信コマンドはASCII文字となっています。

ハイパーターミナル、MATLABのM-fileでの通信は確認済みです。

もしこのような環境でRS232c通信が利用可能なC(またはC++)プログラムをご存知の方がいらっしゃれば、教えていただけないでしょうか?
よろしくお願いします。


「ソースファイル」
#include "RS232c.h" //このヘッダーを取り込みます。

int _tmain()
{
RS232c rs;
rs.Connect();
rs.Send("POS#?,,1 CR/LF");//文字列を送信 Send(送信文字列)
char w[100];
rs.Read(w,100); //文字列の受信 Read(char配列,読み込む文字数)
printf(w);
getchar();
return 0;
}

「ヘッダーファイル」
#ifndef _RS_232C_H_
#define _RS_232C_H_

#if _MSC_VER > 1000
#pragma once
#endif

#include <windows.h>
<中略>
bool RS232c::Connect(char* PortNmae="COM1",
int BaudRate = 115200,
int ByteSize = 8,
int Parity = NOPARITY,
int StopBits = ONESTOPBIT,
int RTS = RTS_CONTROL_DISABLE,
int DTR = DTR_CONTROL_DISABLE,
int ReadTimeOut =700,
int WriteTimeOut = 700
)
<中略>
{
RS232c::~RS232c(){
//ポートを閉じます
CloseHandle(m_hComm);
}
#endif // _RS_232C_H_

初めて投稿します。

現在卒業研究で、RS232cで接続された2次元センサ(カメラで対象物をトラッキングし、2次元座標データをPCに送る計測器)のデータをPC(OSはXP)で読み込もうとしています。
以下のサイトを見つけ、
http://7ujm.net/C++/Rs232c.h.html
ソースファイルとヘッダーファイルからなるプログラムをつくり(プログラムの変更点は最後に明記しました)
、VC++とBORLANDC++で試してみたのですが
VC++ではプロジェクトのビルド時に
「fatal error C1010: プリコンパイル済みのヘッダーの検索中に予期...続きを読む

Aベストアンサー

> の値を変更すると変わってくるので、ターミネータはうまく機能していないのかと思うのですが、

そのようですね。

また、WinRS のほうの 「Abnormal program termination」は、おそらくタイムアウトだと思います。

これから推定すると、計測器からは(crlf ではなく)cr しか帰ってきてないのではと思います。
WinRS *port = new WinRS(1, 115200, ifLine::cr, "8N1", false);
(3つめのパラメータが、ifLine::crlf → ifLine::cr に変更。これで、cr を受け取った時点で帰ってきます)

あるいは、port->talk("POS#?,,1 \0"); のレスポンスはすぐに帰ってくるのでしょうか?
port->listen() は、これを呼び出したときに受信データがないと、約6秒でタイムアウトします。
もしもレスポンスに時間がかかるのであれば、

port->talk("POS#?,,1");
while(! port->loc()); // レスポンス受信まで待つ
port->listen(buff, len);
としてみて下さい。

また、port->listen() の len は、呼び出し時には、受信できる最大バイト数を、返り時には、実際に受信したデータ数を持っています。
このため、talk() を複数行う場合は、
len = 1024;
port->talk("POS#?,,1");
のように毎回 len を設定して下さい。
これがないと、前回の受信バイト数をもって listen() を呼び出すので、前回のレスポンスより長いレスポンスが受け取れなくなります。

最後に、"POS#?,,1 \0" のような、最後の "\0" は不要です。
(あっても無害ですが)
"~" で囲まれた文字列の終端には、暗黙のうちに、"\0" が付加されますので。

> の値を変更すると変わってくるので、ターミネータはうまく機能していないのかと思うのですが、

そのようですね。

また、WinRS のほうの 「Abnormal program termination」は、おそらくタイムアウトだと思います。

これから推定すると、計測器からは(crlf ではなく)cr しか帰ってきてないのではと思います。
WinRS *port = new WinRS(1, 115200, ifLine::cr, "8N1", false);
(3つめのパラメータが、ifLine::crlf → ifLine::cr に変更。これで、cr を受け取った時点で帰ってきます)

あるいは、...続きを読む

Qc++ stringの使い方

お世話になります。
最近c++始めました。
stringの使い方がよくわかりません。
以下のstringの使い方が問題ないか確認頂けますか。
スマホで書くため、文法が合ってないと思いますが、stringの使い方だけ確認させてください。
引数にstringで囲って渡すのは実装として普通行いますか。
やってはいけないですか。
是非ご教示ください。

#define STR1 "mojiretu"
main()
if(check(string(STR1)))



bool check(string str)

Aベストアンサー

間違っちゃいないけど、直に const string でかまわんのでは?

#include <iostream>
#include <string>

const std::string STR1 = "mojiretu";

bool even_length(const std::string& str) {
return str.length() % 2 == 0;
}

int main() {
if ( even_length(STR1) ) {
std::cout << STR1 << " : even\n";
} else {
std::cout << STR1 << " : odd\n";
}
}

QWindows上のマウス操作をプログラムで実現したい(C,C++,C#)

Windows上で、マウスで右クリック→ファイル名をコピー→貼り付け

という動作をプログラミングによって実現したいのですが、どのようにしたら良いのでしょう?
やはり、APIを使うと思うのでC#が適しているかと自分では思っているのですが、CでもC++でもかまいません。
どなたかご教授願えますか?よろしくお願いいたします。

Aベストアンサー

★『ファイル名をコピー』の処理を自分のプログラムに組み込んでみるのはどう?
・もう少しだけ詳しい動作の仕組みを補足要求します。
・また『mouse_event』という API 関数は古いので新しい関数『SendInput』を使いましょう。
・ただし、この『SendInput』関数はマウス以外にキーボードのエミュレートも行えるため
 少しだけ複雑な指定になります。慣れれば何てことないが…。→また紹介します。
・まぁ、とにかくもう少し何を行いたいのかを補足して下さい。
・まさか、本当に『右クリック』→『ファイル名をコピー』→『貼り付け』の3ステップを
 行いたいのですか?

参考URL:http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200412/04120036.txt

QVisial C++おけるπの使い方

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(void){
int i,n,count=0;
double x,y,r,error;

srand((unsigned)time(NULL)); /*乱数の初期化*/

printf("How many trials?");
scanf("&d",&n);

for(i=0;i<n;i++){
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);

if(y<sin(M_PI*x)){
count++;
}
}

r=(double)count/n; /*キャスト演算子を使用*/
error=2/M_PI-r;

printf("Result is %f (Error: %f)\n",r,error);

return 0;
}

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include ...続きを読む

Aベストアンサー

★アドバイス
・math.hをインクルードする前に『_USE_MATH_DEFINES』定数を define します。

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main( void )
{
 :
 return 0;
}
必ず include する前に定義して下さい。

QCの関数をC++とCのどちらからでも呼べるようにするには?

お世話になります。

環境はVC6.0となります。
C++で作成したプログラムから、Cで作成したDLLを呼び出す場合、DLL側のプロトタイプ宣言に「extern "C"」を付加する必要があると認識していますが、
呼び出し側がC++かC言語が分からない場合、Cで作成するDLLにはどのように記述するのが一般的(標準的)でしょうか?

ちなみに調べてみたところ、
以下のように、「__cplusplus」でくくる方法もあるようですが、C++の標準仕様ではないとの記載がありました。

#ifdef __cplusplus
extern "C" {
#endif

int function(int num);
int function2(int num);
int function3(int num);

#ifdef __cplusplus
}
#endif

よろしくお願いします。

Aベストアンサー

DLLプロジェクトに*.defファイルを追加し、
その内容にエクスポート関数名を指定するのが、
最も簡単で、一般的です。
====MyDll.def===
LIBRARY MyDll
EXPORTS
function @1
function2 @2
function3 @3
================
MyDll.lib(エクスポートライブラリ)をリンクす場合は
インポート用ヘッダーでのプロトタイプ宣言を
__declspec( dllimport)で修飾します。
実際にやってみて、細かい点を確認してみてください。

QcygwinでのC++の使い方

cygwinでC言語で書いたプログラムを実行したいのですがcygwinを起動すると
私の名前@なにやらアルファベット
が表示され次の行に

と表示されるんですがこの後にどんなことを書けば
#include<・・・>
としてC++のプログラムを書いていくことができるんですか?そもそもcygwinの使い方が根本的に違うんですかねえ?それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?とりあえずプログラムを実行できるようにしてください。おねがいします。

Aベストアンサー

> それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?

おおむねその通りです。

メモ帳でも何でもよいので、エディタでソースファイルを作成してください。作成したソースファイルは、とりあえずホームディレクトリに格納するとよいでしょう(C:\cygwinにCygwinをインストールしたのであれば、C:\cygwin\home\アカウント名がホームディレクトリになります)。

作成したソースファイルがfoo.cppだった場合、

g++ foo.cpp

とすれば、a.exeという実行ファイルが同じディレクトリにできるはずです。そこで、

./a

と入力すれば、a.exeを実行することができます。

QC++の関数をfortranから呼びたい。(g++, vc2005)

C++の関数をfortranから呼びたい。(g++, vc2005)

いつも大変お世話になっています。

以前、下記の質問させて頂いたのですが、
再度問題が発生したので改めて質問させて頂きます。
http://oshiete.goo.ne.jp/qa/5806443.html

WindowsXPで
MinGWを入れて、fortranコンパイラはg77を
VC++2005を入れて、c++コンパイラはclで
実行しようとしています。

以下の内容が実行結果なのですが、
リンクのときにwarningが出ますが、これは何なのでしょうか?
宜しければ、ご教授お願いします。
※ソースは前回の質問に載せてあります。

D:\C>g77 -c helloFortran.f

D:\C>cl /c /EHsc funcHelloC.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

funcHelloC.cpp

D:\C>g77 helloFortran.o funcHelloC.obj
Warning: .drectve `/DEFAULTLIB:"libcpmt" /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unr
ecognized

D:\C>

C++の関数をfortranから呼びたい。(g++, vc2005)

いつも大変お世話になっています。

以前、下記の質問させて頂いたのですが、
再度問題が発生したので改めて質問させて頂きます。
http://oshiete.goo.ne.jp/qa/5806443.html

WindowsXPで
MinGWを入れて、fortranコンパイラはg77を
VC++2005を入れて、c++コンパイラはclで
実行しようとしています。

以下の内容が実行結果なのですが、
リンクのときにwarningが出ますが、これは何なのでしょうか?
宜しければ、ご教授お願いします。
※ソースは前回の質問に載せ...続きを読む

Aベストアンサー

http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_2.html
リンカに渡すオプション引数なのですが、書式がMS系のものになっていて、g77では理解できないので、無視する、という警告です。


# 前回のでちゃんとコンパイルができたのに、わざわざVC++を使う理由はなんでしょう?


人気Q&Aランキング

おすすめ情報