
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
ついでにどうするかというと, 「宣言に見えなければいい」ので, 例えば
・キャストする: (void)Hoge(boo); とか static_cast<void>(Hoge(boo)); など
・捻ってみる: 0, Hoge(boo); など
という方針はあります.
No.5
- 回答日時:
クラスも構造体も同じですが, デフォルトコンストラクタは「ユーザ定義のコンストラクタがない場合」に限りコンパイラが暗黙に提供します>#3.
今の場合はユーザ定義のコンストラクタ Hoge::Hoge(Boo &) があるので, デフォルトコンストラクタを暗黙に定義することはしません. にもかかわらず (図らずも) デフォルトコンストラクタで初期化しようとしたのでエラーになっています.
No.4
- 回答日時:
># 構造体もクラスの宣言と同じように扱われるのは驚きでした。
構造体メンバの宣言部にアクセス指定子を拡張し、コンストラクタやデストラクタなど、色々な拡張を施したしたのが「クラス」ですから、当然、構造体にもコンストラクタやデストラクタが使えます。
共用体も構造体の拡張ですから、共用体にも同様の事が言えます。
構造体、共用体、クラスオブジェクトが「メモリ上で、どのように存在しているか?」を、つまり「メモリ上の実装」を考えれば「どれも同じような物」と気付く筈です。
No.3
- 回答日時:
#1です。
>#2 とても勉強になりました。
>> 「error C2512: 'Hoge' : クラス、構造体、共用体に既定のコンストラクタがありません。 」
私のせいで話が間違った方向に行った気がします。
多分、質問の意図は2重定義になることではなく、なぜコンストラクタがないのか?、ということだったのかもしれません。
structもメンバがpublicなclassとして扱われるが、
classとして宣言した場合と異なり
暗黙のコンストラクタ・デストラクタは定義されない
ってのが質問の答えになるのですかね。
No.2
- 回答日時:
C++ において構造体は (デフォルトの) アクセス指定子がすべて public であるようなクラスです>#1. だからコンストラクタやデストラクタも定義できます (例えば std::pair はコンストラクタをもつ構造体です) し, その気になれば他のクラスや構造体から導出することもできます.
で, このように式文と (かっこが余計についた) 宣言が構文上区別できなくなることがあり, その場合には宣言として扱うことになっています (6.8 Ambiguity resolution). だから, ここでは「Hoge::Hoge(Boo &) を呼び出す式文」としてではなく, 「Hoge 型の変数 boo を宣言する」と解釈しなければなりません.
なお, 同じようにコンストラクタ呼び出しを使って変数を定義しようとすると「関数の宣言」と解釈されることもあります.
No.1
- 回答日時:
試してみました。
Hoge(boo)は、 booを引数にHoge(Boo&)コンストラクタを呼ぶのではなく
Hoge boo; のように Hoge型の boo オブジェクトを構築する意味です。
エラーメッセージを全て読めば
booが二重定義されていると
表示されているはずです。
# 構造体もクラスの宣言と同じように扱われるのは驚きでした。
# コンストラクタもデストラクタも定義してみると、
# ちゃんと機能していたので驚きです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
【C++】関数ポインタの使い方
C言語・C++・C#
-
-
4
cout と cerrの違い
C言語・C++・C#
-
5
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
6
C++ protectedにアクセス不可
C言語・C++・C#
-
7
deleteで開放するとエラーになる原因がわからない
C言語・C++・C#
-
8
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
9
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
10
外部依存関係について
C言語・C++・C#
-
11
クラスのアドレスを引数として渡したい
C言語・C++・C#
-
12
適切な変換関数が存在しない???
C言語・C++・C#
-
13
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
14
LPSTR型の初期化について
C言語・C++・C#
-
15
ネットワークにつながっているかの確認
UNIX・Linux
-
16
char*を初期化したいのですが
C言語・C++・C#
-
17
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
18
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
19
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
20
C++でfriendクラスにしているのにprivateメンバにアクセスできない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダイアログ表示時にチェックボ...
-
既定のコンストラクタがない?
-
ダイアログクラスのコントロー...
-
オーバーライド関数の呼び出し...
-
CEditクラスの透過について
-
エディットコントロールでEnter...
-
FriendとPublicの違い。。。
-
MFCアプリのコマンドラインでパ...
-
VC++ 7.1 で メインウィンドウ...
-
C++ protectedにアクセス不可
-
【ASP.NET】 独自で作成したク...
-
C#で通常のbuttonコントロール...
-
正規表現 [^/]+ の意味を教えて
-
モーダレスなメッセージボック...
-
MFCのドラッグ&ドロップについて
-
(UWSC) 「#32770」の意味わかり...
-
メンバ変数のサイズの増加
-
Delphi6 DLL内でのメモリ共有(?)
-
このコンパイルエラーの意味に...
-
form1 から form2 へのデータの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
イベントにAddHandlerされてい...
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
クラスのアドレスを引数として...
-
WindowsAPIのリストビューの...
-
エディットコントロールのイベ...
-
MFCアプリのコマンドラインでパ...
-
ボタンのオーナードローについて
-
正規表現 [^/]+ の意味を教えて
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
C# 別プロジェクトのフォームを...
-
オーバーライド関数の呼び出し...
-
MFCのCListCtrlでスクロールを検出
おすすめ情報