質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4977閲覧

#defineによるclass置き替えについて

gara_kuta_ya

総合スコア54

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/02/22 05:06

visual studio2015・c++環境での質問です。
下記のように#defineでclassを置き換えたときに、
コンストラクタ以降の関数宣言場所に緑線と関数定義が見つかりませんと出ます。
関数定義は別ファイルにちゃんとあるのを確認しましたが、
この場合の対処方法がわからず質問させていただきました。
一応コンパイルと実行はできるのですが気になってしまっています。
アドバイスよろしくお願いします。

#define GAMEMANAGER(T) class T GAMEMANAGER ( GameManager) { public: GameManager(); ~GameManager(); void Initialize(); void Update(); void Draw(); void Clear(); };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コンストラクタ以降の関数宣言場所に緑線と関数定義が見つかりませんと出ます。

これはVS2015のインテリセンスの機能からいってどうしようもないと思います。

そもそも何で#defineでこのような定義をしているのでしょうか?
この

C++

1#define GAMEMANAGER(T) class T

によって可読性が上がっているとは思えないし、メンテナンスが楽になっているとも思えないんですが。

これなら、

C++

1class GameManager 2{ 3 //クラスの本体 4};

と書いたほうが余程わかりやすいと思います。

投稿2017/02/23 08:37

編集2017/02/23 08:42
PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gara_kuta_ya

2017/02/23 09:27

返答ありがとうございます。 言われてみれば確かに#defineのGAMEMANAGER(T)はちょっと意味がないですね。 今回の#defineの名前違いのもので汎用性があるのを使わないといけない課題がやっている知人が言っていたので、 どうなのかなと調べてもわからなかったので聞いた次第です。 また無理してclassを #define 名前(T)に置き換える必要ななさそうですね。 もし使うならプログラムにバグがあるわけではなく ちゃんと動くのだから気にしても仕方がないのですね。
PineMatsu

2017/02/23 09:31

そう、クラスなのか何なのかが使っているところを見た時に、パッと見てわからないでしょ? なお、定義したクラスを別名で使うというのはあると思います。(既に定義済みでそのクラス名を諸事情で変更できない場合など)。その場合は、typedefやC++11ならusingを使ったりして別名定義します。
gara_kuta_ya

2017/02/23 09:55

アドバイスありがとうございます。 使うこと自体はあるんですね。勉強になります。
guest

0

プリプロセッサマクロではソースをどうにでも複雑に変更できてしまいますね。ゆえにエディター上での文法チェックを完全に行おうとすると、Visual Studioエディターは「頻繁にプリプロセッサを動かしてマクロ置き換えをした上でないと文法のチェックができません」

単にC,C++といった言語の文法であれば差分コンパイル技術により編集された一部だけを解析することで高速な文法チェックが行えるようになっていると思います(ちゃんと知っているわけではなく想像ですが)。しかしマクロの置き換えは自由度が高すぎてなんでも置き換え出来てしまうためインクリメンタルコンパイルと相性が悪い気がします。

以上は単なる推測ですがそれがあっているならVisual Studioエディターは編集効率を落とさないためにプリプロセッサディレクティブがソース上に書かれているとそれをリアルタイムには解釈できないのだと思います。

対処については(単なる推測ですが)プリコンパイルヘッダー(afx.hとかです)上に#defineをおいた上で一度コンパイルしてみてはいかがでしょう?

投稿2017/02/22 06:04

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gara_kuta_ya

2017/02/22 06:49

早い回答ありがとうございます。 まだアドバイスされている点が理解できてないので、 プリプロセッサマクロなどを調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問