2010-12-30 16 views
3

これで、中間のDelphiからC++ Object Orientedのプログラミングに移行しようとしています。私はVisual C++ 2010でIvar Hortonの本を読んだことがあります。シンプルなコンソールアプリケーションは問題ありません。私は言語そのものを得ます(ちょっと)。私が苦労しているのは、ヘッダーとクラスです。C++ヘッダーファイルとクラスを理解するのに役立ちます

私はまた、一般的なヘッダファイルとクラスについても理解しています。ヘッダーやクラスをいつ使うのですか?私はすべてのことについてクラスを作成する必要がありますか?私の実際の仕事関数はヘッダーファイルかCPPファイルである必要がありますか?私はこれらの適切な使い方に迷っており、より経験豊富なプログラマーから実際のガイダンスを利用することができます。

MFCを使用してWindowsアプリケーションに移行しようとしています。

+0

のVisual C++!= C++ – Falmarri

+5

のVisual C++ ==一の実施、同じようにすべてのC++コンパイラ –

+7

[C++ブック](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)をお持ちですか?あなたは、新しい言語を学び、偶然を認識するほど、ある言語から別の言語へ「移行」しません。つまり、車を運転して飛行機に乗ることから、飛行機を飛ぶことを学び、何かが車を運転するのと同じように起きた場合は、「それは膨らみます」と言って移動します。 – GManNickG

答えて

3

私はまた、どのようなヘッダファイル と一般的なことを理解しています。私は何ですか ヘッダーまたはクラスを使用すると、実装されていませんか?私は すべてのクラスを作成する必要があります 私はやっていますか?私の実際の仕事関数はヘッダーファイルかCPPファイルの中に が必要ですか? 私はこれらの適切な使用に失われており、より実践的なプログラマーの実際の指針 を実際に使用することができます。

私は数年前に再び風を吹きましたが、私は同じ質問をしていたでしょう - それはよく覆われているものではありません。だから私はあなたの問題の肉として見るその部分を分解しましょう。

私は私が行うすべて のためのクラスを作成する必要があり か?

これは主観的ですが、私は「いいえ」と言います。モデル化したいもののクラスを作成する必要があります。たとえば、intcharのようなCの型よりも複雑なデータ項目が考えられます。また、StringクラスとSTLのコンテナ(look at vector)を使用する必要があります。要するに、これはおそらくあなたが行うほとんどのことに対してクラスを使用していることを意味しますが、それはあなたのコードの最後の小さな部分が何とかクラスに落ちなければならないと言っているわけではありません。

私はまた、どのようなヘッダファイル と一般的なことを理解しています。

私はちょうどあなたが得るものを繰り返すことができます。おそらくあなたが知っているように、Cと結果としてC++は、コンパイル単位の前にない関数(すべてのヘッダーがインクルードを置き換えた後の完全なソースコード)のプロトタイプ定義を必要とします。このように:

#include <iostream> 
using namespace std; 

int testadd() 
{ 
    int a = 4; int b = 2; int c = add(a, b); 
    return c; 
} 

int add(int x, int y) 
{ 
    return x + y; 
} 

int main(int argc, char** argv) 
{ 
    cout << "result is: " << c << endl; 
    return 0; 
} 

(不自然な例)testaddaddを見つけることができませんが、mainaddを見つけることができるので、動作しません。

あなたのプログラムは理想的には、あなたが使いたいすべての関数、クラスなどのリストから始めるべきです。誰かが、読み込みをもっと簡単にし、(ライブラリのシナリオで)あなたの仕事を使ってプログラマーがプロトタイプをあなたの関数に書き直すのを防ぐので、これらが実装とは別のファイルにあれば良い考えです。他のライブラリをもっと使いやすくします。

あなたのクラスを実装するときに、あなたは選択肢があります:

  1. プロトタイプの形でクラスを宣言します(関数がプロトタイプとして終わら)とCPP単位でそれらを実装します。
  2. ヘッダーファイルにロット全体を実装します。

あなたがしていることは正直にあなた次第です。私はそれがより良いと思うので、私は1に固執するが、誰もあなたがしなければならないと誰も言わず、両方のテクニックが使われているのを見た。

ちなみに、1を選択すると、main.cpp、myclass.h、myclass.cppがあり、main.cppからmyclass.cppに実装されたmyclassメソッドを呼び出すとします。これらの2つのユニット(* .cpp)はマシンコード形式(vcの場合はmain.objとmyclass.obj)にコンパイルされています。リンカは、これらの2つのオブジェクトをexeに持ち込み、各コンパイル単位で呼び出されたすべてのシンボル関数を保証することを、参照されている他のオブジェクトまたはライブラリの1つに見つけることができます。それが起これば、それはexeをまとめます。そうでない場合は、エラーが発生します。これは、学習ユーザーにこのような疑問を引き起こす別の結果(リンクエラー)です。

+0

これは私が探していたものですが、ほとんどの場合、切断をより緊密にするために役立ったことを教訓として繰り返しています。 – JamesW

+1

他の人が推薦している本を掘り下げたときに、コマンドラインで十分なことを十分に覚えることはできません。プログラムステージを一度に構築することは、IDEが非常に有用で何が起きているのかを理解するのに役立ちます。さまざまな段階で結果を出力するコンパイラを取得することさえできます。未来を念頭に置くべきこと。 –

1

ヘッダーファイルは必要ではありません。理論的には、実装ファイルだけでアプリケーション全体を構築することができます。ヘッダーファイルのポイントは、定義と実装を分離することです。それらは、より簡単に/より速くリンクやコンパイルを行う方法です。

いいえ、すべてのクラスを作成する必要はありません。グローバル関数はC++では完全に正当です。

2

C++のヘッダは、Delphiユニットのインタフェースに似ています。 (プロトタイプと宣言を介して)他のコンパイル単位が知ることができるものと、関連するコンパイル単位が(外部宣言を介して)他のコンパイル単位について知ることができるものを定義します。シングルコンパイル単位プログラムでは厳密には要求されませんが、責任の明確な分離について考えるのに役立ちます。

C++のクラスは、Delphiのクラスとほとんど同じです。タスクに適切なときにそれらを使用します。

0

厄介です。 これは大きな話題です。あなたはOOPの全体概念を説明することを求めています。 ウェブには、それに関する多くのものがあります。最初に私は
OOP Concept in Java - これはJavaであるが、概念は同じです。 そして、C++には何がありますか?あなたはこの愚かなヘッダーを持っています。ヘッダーは基本的にクラスに含まれる情報です。ヘッダー自体には重要なコードはなく、「紹介」のみです。コンパイル時にコードはクラスから取得されます。それが助けてくれることを願っています

+1

彼はOOの概念についてそれほど混乱していません。Javaでは、各クラスDOESが特定のファイルとの関係を持っているため、Javaでの解答を読むことは完全に彼を混乱させるでしょう。 C++では、この関係は存在する必要はありません。 – Falmarri

2

私はまた、一般的なヘッダファイルとクラスについても理解しています。

いいえ、申し訳ありません。私はあなたがしないことを恐れています。私はあなたがその声明で使用している用語だけで分かります。

単語 "ヘッダー"と "クラス"は排他的ではなく、関連しています...それらは同じレベルでさえありません。

"class"はC++言語構造です。

"header"は、C++コードを含むファイルシステム上のファイルです。

私があなたが話している文脈の中の「クラス」を意味すると思うのは、「翻訳単位」という.cppファイルです。ここで問題となるのは、クラスには翻訳単位との1:1または1:多くの関係がないことです。クラスコードは任意の数の.cppファイルに含めることができ、.cppファイルには任意の数のクラスなどのビットを含めることができます。私たちが間違った用語を継続し、いくつかの不便な事実を省略した場合

実際には、それはクラス定義は、通常は(クラスが言うその部分を見えるところそれはだから「クラス」のファイルとして知られている必要がありますヘッダだろう{...};)。しかし、翻訳単位でもクラスを自由に定義することができるので、この宇宙を別のものにする必要があります。

ヘッダーと翻訳単位(または必要に応じて「ソースファイル」)の違いは、ヘッダ内のコードがヘッダー要素としてコンパイルされていないことです。完全に「ソースファイル」に含めます。つまり、ヘッダーはコンパイルされず、前処理されます。

ヘッダーに入れたものは、どこにコピーして貼り付けたいものなのですか?クラス定義や宣言は、それらの2つだけです。インラインファンクションコード(コンパイラがどこにジャンプしたのかがわかるコード - これは厳密なストーリーではありませんが)を含めることもできます。テンプレートはインスタンス化しようとするとどこにでも完全に存在しなければならないので(つまり、どこでもコピー/ペーストする必要があるため)ヘッダーに入れるのに適したその他のものです。

"ソースファイル"に入れたものは、ローカルアクセスだけを望んでいるか、その事例の複数の例が言語に違反するためです(非ソースファイルの複数の定義)例えば、インライン、グローバルf()関数)。

だから、同時に喜んで助けて喜んで混乱させてください。私はあなたがまだそれを理解していないことを知っていますが、少なくとも今あなたはその事実をもっと知っています。あなたはあなたの方法であなたを助けるために別の本を空想した場合デヴィッド・パーソンズによって

+0

あなたがここで言ったことのいくつかはとても役に立ちます。私はあなたが取っているものよりも物事をもっと把握していましたが。私は私の質問ではっきりしていないかもしれません。私はヘッダーとソースの区別を取得し、クラスがヘッダーファイルにあることも理解しています。私が問題を抱えていたのは、それらを使用するときでした。私は、単一の.pasファイル内のすべての関数と宣言を一番下にしたDelphiコードベースから来ています。あなたの答えがすでに理解されているものに少しばらついている間に、私は本当に見つけようとしていたときにあなたもヒットしました。 – JamesW

関連する問題