- ベストアンサー
IncludeではなくClassで宣言するケース
kmeeの回答
- kmee
- ベストアンサー率55% (1857/3366)
とりあえず。 勝手に言葉作らないでください。 使うなら、その意味を説明してください。 ○#includeを使う場合 // ファイル: test0.h class testA { 定義... } ; // ファイル: test0.cpp #include "test.h" int main(){ testA objA ; } ○ 質問者が言うところの「Classで宣言」と思われるもの // ファイル: test1.cpp class testA { 定義... } ; int main(){ testA objA ; } でよろしいのですか?それとも別のなにかですか? もし、この2つなら、単一ソースファイルで使うときは、まったく等価です。
関連するQ&A
- include無しにclassが書けない
粗末な質問タイトルで申し訳ありません。 Visual C++2010で、includeを書かずにclass宣言を行おうとすると「Error:PCH警告」が発生します。 この理由をご教授ください。 IntelliSense: PCH 警告: 適切なヘッダー停止位置が見つかりません。 というエラーメッセージが表示されるのですが、これはプロトタイプ宣言がないときに発生する警告らしいですね。私が書こうとしているソースコードを次に示します。 -----main.cpp---- class TestClass {}; int main(void) { return (0); } ----------------- このソースで、"class"の部分に赤波線が引かれて先述のエラーメッセージが表示されます。 このソースの先頭に#include<iostream>なり#include<stdlib.h>なり何かインクルードを記述すると警告はなくなります。 しかしクラスはその枠のみですし、ライブラリ関数も何も使用していないのでとくに必要なインクルードファイルも何もないと思うのですが、どうしてこのようなエラーが発生するのでしょうか。 あと、蛇足になりますが、本来はクラス宣言部分を別のヘッダーファイルに分けたいのです。 クラス宣言部分を別のヘッダーに分離してヘッダーの先頭に #pragma once を記述するか、分離したヘッダをmain.cpp内でインクルードしてもエラーは解消されます。 (何からもインクルードされなかったらエラーになる) もう何が何やらさっぱりわからないです><
- ベストアンサー
- C・C++・C#
- ポインタによる包含&ヘッダにincludeしない、 場合でtemplateの定義に…
class Bの宣言をしているヘッダ中で class A; を、前方宣言し、そのポインタだけを持たせ、ソースファイルのほうにclass Aの中身が分かるように、#includeして、ソースファイルに関数の実装やstatic変数の定義を書いていた、とします。 しかし、templateを使う関数についてはコンパイル時に解決できないといけないので、それだけはヘッダに持ってきました。 その時 includeが一切書かれていない、class Bのヘッダ内において class Aのメンバを参照するようなコードを書いたとき クラス外、クラス内、いずれに書いても 正常にコンパイルできました。 通常の関数では当然無理なので、もともとtemplateがコンパイル時解決を強要するものなのでそういう仕様にしててくれてると考えられますが 1.これは、C++の標準仕様でしょうか?それとも処理系依存でしょうか? あと、templateに関して 2.特殊化ならソースにかけるのは標準仕様でしょうか?それとも処理系依存でしょうか?
- ベストアンサー
- C・C++・C#
- ヘッダーファイルでは、他のヘッダーファイルをインクルードできないのか
Javaを仕事で使っています。 最近趣味でC++を始めました。色々形式の違いに戸惑っています。 C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。 そこで今、壁にぶちあたりました。 あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。 Foo.hは以下のような感じ。 #include Hoge.h 中略 GetHoge(Hoge hoge); コンパイルエラーでは error C2011: 'Hoge' : 'class' 型の再定義 などと言われます。 クラスとその同名のヘッダーファイル、という形式を変えずに 他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか? C++に関しては全くの素人です。詳しい方、ご教示願います。
- 締切済み
- C・C++・C#
- フレンド宣言のスコープがわかりません。
フレンド宣言のスコープがわかりません。 #include <iostream> class X { friend class Y; friend void f() { std::cout << "f()" << std::endl; } }; //class Y; //void f(); class Z { Y *ymem; void g() { ::f(); } }; int main() { ::f(); return 0; } C++プライマー第4版を読んでいます。511ページに上記のプログラムがあり、 「フレンドで導入されたクラスと関数(定義または宣言)は、すでに宣言されたものとして使うことができる。」 と説明されています。 しかし、g++(gcc4.4.1)でコンパイルするとエラーになります。コメント部分を外すと実行できます。 C++プライマーが正しいのか、gccが正しいのか、私が思い違いをしているのか、わかりません。 ご存知の方はいませんか。
- ベストアンサー
- C・C++・C#
- 【C++】使わないinclude
(1)使わないincludeをチェックしたいです。 (できれば前方宣言しているclassも) visual studioを使っていますが、 visual studioではなく、ツールでもいいです。
- ベストアンサー
- C・C++・C#
- C++のfriend classについて
C++のfriend classについて C++の初心者です。 C++でのfriend classは基本的に、全プロパティに対するsetter,getterを持たせて 集約、コンポジションにより代替が可能だと思うのですが、今勉強の為に読解して いるソースではsetter,getterの実装がなされているクラスの使用に対しても friend 宣言が多発していて中途半端なルールになっていると感じてしまいます。 friend 宣言によって別途実現可能になる事や、パフォーマンス的に有利(微々たる 物なはず)な事ってあるのでしょうか?
- ベストアンサー
- C・C++・C#
- 相互のインクルードファイルの方法について
下のように、2つのヘッダーファイルを相互にインクルードすると colorparettewindowclass.h(2) : fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024 というエラーが表示されます。(2つ表示される) 一応、#pragma onceを使用していますが、 エラーになります。 どうすればいいでしょうか? よろしくお願いします。 --------------------------------------------- <<ColorParetteWindowParentClass.h>> #include"WindowBaseClass.h" #include"ColorParetteWindowClass.h" #include"ColorClass.h" #pragma once class ColorParetteWindowParentClass : public WindowBaseClass { ((処理関数等定義)) }; --------------------------------------------- <<ColorParetteWindowClass .h>> #include"WindowBaseClass.h" #include"ColorParetteWindowParentClass.h" #pragma once class ColorParetteWindowClass : public WindowBaseClass { ((処理関数等定義)) };
- ベストアンサー
- C・C++・C#
- 基本クラスと派生クラスの宣言順序
C++のクラスの宣言は、基本クラスから先に宣言しないといけないのでしょうか。 例. 次の順で宣言するとエラーになる。 class A : public B { public: private: } calss B { public: private: }
- ベストアンサー
- C・C++・C#
- 【C++】相互参照
以下のような相互参照は、 感覚的には、なるべくならしない方が良いと感じるのですが、 どのようなメリット・デメリットがあるでしょうか? class A B* m_b class B A* m_a ■少なくとも、多くのクラスによって構成された巨大なDLLが、 相互参照ばかりで作られると、 (1)クラスAのポインタ型のメンバーが、クラスB内で値が変わりうる、 また、クラスBを、クラスCで参照していたら、そこでも値が変わりうる。 さらにクラスCを、クラスDで参照していたら、(略)となり、 処理・メンバー値の変更の影響の把握が困難になる。 (2)lib/objの作成順のミスや管理、 (3)いずれかのクラスのリコンパイルが発生した時、 リリース物のリコンパイルが発生しまくる。 ということがあり、良くないと考えています。 - - - - - - - - - - - - - - - 相互にインタフェースし合う項目を、メンバーとして宣言しつつ、 そのGetter、Setterを用意すれば、強結合にせずに作れるという認識ですが合っていますか? class A B* m_b int x1、y1、z1 x1、y1、z1のGetter、Setter class B Privateなメンバーx、y、z int x2、y2、z2 x2、y2、z2のGetter、Setter .
- ベストアンサー
- C・C++・C#
- インクルード元を知りたい
PHP5.2.4を使用しています。 [a.php] <?php include("b.php"); include("c.php"); $c = new classC(); [b.php] <?php class classB { } [c.php] <?php class classC { public function __construct() { $c = new classB();//←b.phpファイルがどこでインクルードされたか知りたい } } という3つのファイルがあり、a.phpにアクセスするとします。 c.phpファイルのコンストラクタでb.phpファイルにあるclassBを生成していますが、 これはa.phpファイルにおいて先にinclude("b.php");があるので c.phpファイル内でもclassBを認識できると思います。 そこでc.phpファイル内でb.phpファイルがどこでインクルードされたか(この例ではa.phpファイル) 調べる方法なり関数というのはあるのでしょうか?
- ベストアンサー
- PHP
お礼
意図を伝えられず申し訳ありません。 前方宣言のことをお聞きしようとしていました。 ありがとうございます。