• ベストアンサー

includeファイルの読み込み追加の際のコインパイルエラー

麻野 なぎ(@AsanoNagi)の回答

  • ベストアンサー
回答No.9

No.8 です。訂正。 大嘘ついてました。 > あと、CLS_bbb のメンバが protect: であったとしても、CLS_bbb *pbbb = pApp->ccc.pddd; が正しければ、pbbb-> の形でアクセスできます。 いえ、できません。できないのが正解です。 さて、このときに考え方は二つあります。 ・メンバーが protected: である以上、このメンバーを参照したくなるようなプログラムは設計的に間違っている。 ・設計的には間違っているが、特殊な事情があり、「掟破り」をしなければならない。 まず、いずれなのかを見極める必要があります。 その上で、「掟破り」の方法。 これは、派生クラスを作って、セッタやゲッタを定義するという方法があります。 たとえば、ベースクラスの int value が protected: の場合、これを参照すると。 class CLS_bbb_sub : public CLS_bbb { public: int get_value() { return value;} void set_value(int v) { value = v;} } これで、 // アプリケーションクラスのポインタを獲得 CLS_aaaApp *pApp = (CLS_aaaApp *)AfxGetApp(); CLS_bbb_sub *pbbb = dynamic_cast<CLS_bbb_sub *>(pApp->ccc.pddd); ここまで考えてみましたが、やっぱりだめのようですね。 上記雄 ccc.pddd が、CLS_bbb_sub だったら、これで対処できますが、実際には、違うクラスなのだから、上記の2行目で実行時エラーになりますね、きっと。 やはり、それは、アクセスしてはいけないメンバーなのでしょう。

kudamono10
質問者

お礼

返事が遅くなってしまいました。 回答ありがとうございます。 初心者である私にとって非常に分かりやすく説明してくださって 感謝しております。 おかげさまで問題は解決いたしました。 結論からいいますと >・メンバーが protected: である以上、このメンバーを参照したくな>るようなプログラムは設計的に間違っている。 ご指摘の通り設計的に誤っておりました。 考えてみれば、特にprotectedなメンバ関数などを他のプロジェクト のクラスから使用するなんておかしいですよね 調査したところロジックを追加するクラスのインクルードにて 同様なprotectedなメンバ変数・関数が用意されており、 それらを使用すればよいというなんともがっくりな おちでした。 では改めてありがとうございました。

関連するQ&A

  • VC++で、ソースファイルを追加すると、コンパイルエラーになります。

    こんばんは。 VC++6.0を使い、C言語の勉強をし始めました。新規プロジェクト→Win32 Console Application を作成し、簡単なプログラムを作成しています。 最初からあるソースファイルはコンパイル、実行できます。しかし、後から自分で追加したソースファイルは error C2065: 'printf' : 定義されていない識別子です。 という、エラーが出てしまいます。何かが、関連付けられていないのでしょうか?それとも、新規プロジェクトを作成しなければいけないのでしょうか? 私は、VC++が初めてなので、ぜんぜんわかりません。よろしくお願いします。

  • 自作インクルードファイル

    こんにちわ。 いまVC++6.0で開発しようとしています。 自作のincludeファイルを作成し,親プログラムをコンパイルしようと しますが,そのincludeファイルが親プログラムと同じパスに あるときはコンパイルできますが, 別のフォルダに置くと, fatal error C1083: インクルード ファイルがオープンできません。 'XXXXXX.H': No such file or directory cl.exe の実行エラー と出てしまいます。 そこで[設定]の"インクルードファイルのパス"の箇所を 自作インクルードファイルがある場所に設定したのですが, やはり同じエラーメッセージが出ます。 どうすれば読めるようにできるのでしょうか? 教えてください。 よろしくお願いします。

  • atlstr.hのインクルードによるエラーについて

    atlstr.hのインクルードにより生じるエラーについて質問させて頂きます。 開発環境は、Visual Studio 2008 Professional Editionです。 (Visual Studio 2008におけるプログラミングは正直まだ慣れておりませんorz) Visual Studio 2008製品内のVisual C++ 2008において、以下の操作を行いプログラムを 実行すると、コンパイルは通るのですが、プログラム実行後にエラー音が一度鳴るだけ でフォームが表示されないというエラーが発生します。その際、タスクマネージャでプロセ スを確認するとプログラム自体は動いているようで、”AtlStrTest.exe”というプロセスが実 行されているのが確認できます。 1.[ファイル]->[新規作成]->[プロジェクト]で新しいプロジェクトダイアログを表示させる 2.[Visual C++]->[CLR]->[Windows フォーム アプリケーション]を選択し、プロジェクト名   ”AtlStrTest”でプロジェクトを新規作成 3.プロジェクト内に生成された”atdafx.h”の”// TODO: プログラムに必要な追加ヘッダー   をここで参照してください。”というコメントの下に#include <atlstr.h>の一行を追加する  原因を分析しようにも、ヘッダをインクルードしただけでエラーが起きるという状況がは じめてなので、途方に暮れている状態です。 大変恐縮ですが、このatlstr.hのインクルードによるエラーがなぜ発生したのかについて、 どなたかアドバイスよろしくお願いいたします。 【関連情報】  同様の操作を、Win32コンソールアプリケーションで実行したときは、このようなエラーは 出ませんでした

  • VC++ includeファイルについて

    VC++2005でグローバル変数を利用したいと考えています。 そこで、kaisu.hというヘッダーファイルにint n=0;と書いてあります。 そこでプログラムでは、 #include "kaisu.h" しているのですが、エラーがどうしても出てしまいます。 エラーは以下の通りなのですがどのようにすれば良いのでしょうか? error LNK2005: "int n" (?n@@$$Q3HA) は既に Form2.obj で定義されています。 場所::試作品.obj エラー 2 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

  • MFCのインクルードファイルについて

    VC++のMFCについて教えていただきたいのですが。 VC++のプロジェクトには、MFCとかコンソールアプリとかあると思うんですが、普通のWinアプリやコンソールアプリにはなく、MFCで標準的にインクルードされるファイルってどんなものがあるのでしょうか。 今、コンソールアプリでコンパイルしたらエラーとなり、MFCでするとエラーなくコンパイルできます。 よろしくお願いします。

  • VS2010追加のインクルードディレクトリについて

    ソリューションと同階層にソースファイルやヘッダーファイルを散乱させるのは汚いなと思い、フォルダに分けました。 例) .slnの階層     mainフォルダ        main.h        main.cpp     sampleフォルダ        sample.h        sample.cpp      abcdフォルダ        abcd.h        abcd.cpp      efghフォルダ        efgh.h        efgh.cpp するとヘッダーをインクルードする時にパスが増えてしまうのも嫌だなと思って、 プロパティ   C/C++     全般       追加のインクルードディレクトリー で作ったフォルダを全て指定しました。 そうしたら一応 main.cpp で #include "sample.h" だけで通るのですが いつも #include "s まで打つとsample.hが候補で出てきてたのですが出なくなってしまいました。 代わりに当然といえば当然ですが #include "sample/sample.h" は候補に出てきます。 追加のインクルードディレクトリーをしても 候補は直接出てくるようには出来ないのでしょうか? パスを全部書いてしまうと追加した意味がありません… これと同様の質問なのですが、 abcd.cpp で main.h をインクルードしたい時も 候補には出ず、../を打って出てくると思うのですが こちらも追加のインクルードディレクトリをしても直接出るようには出来ないのでしょうか? なにか変なことを言ってるような気がしてきましたが よろしければ教えて下さい。

  • VisualC++2005ExpressEditionBeta2にてインクルードファイルのディレクトリを登録したいのですが..

    「Visual C++ 2005 Express Edition Beta2」にて、[ツール] -> [オプション] -> プロジェクトおよびソリューション-> VC++ディレクトリ にある「ディレクトリを表示するプロジェクト」の中からインクルードファイルを選択しても何も反応がありません。 インクルードファイルのある場所を登録したいのですが、この方法では登録できないのでしょうか? よろしくお願いします。

  • コンパイルエラー「include ファイルを開けません」

    あるプログラムをコンパイルしたところ、 下記コンパイルエラーが発生しました。 ヘッダファイルが開けないようなのですが、 これは自分の開発環境に必要なファイルが足りないのでしょうか? 解決する方法が分からないので、ご存知の方おられましたら ご教示お願い致します。 環境はVC++2005でフルインストールしています。 fatal error C1083: include ファイルを開けません。'WtsApi32.h': No such file or directory

  • 【SSI】include file、include virtualが動作しない

    htmlはほぼマスターしているのですが、SSIは超初心者です。 標記の通り、include file、include virtualを試しているのですが、参照先のファイルが表示されません。サーバにはアップロードしておらず、ローカルで確認しているのですが、これでは動作しないのでしょうか。 --index.shtml <html> <head> </head> <body> <!--#include file="0000.html" --> ... <!--#include file="0001.html" --> </body> </html> --0000.html <html> <head> </head> <body> あああ </body> </html> 情けない質問ですが、よろしくお願いします。

    • ベストアンサー
    • HTML
  • 複数プロジェクトをビルドしたとき、DLLに新しく追加したClassのみがリンクエラーになる

    VC++6.0上で、複数の関連するプロジェクトをすべてビルドしたときのリンクエラーで悩んでいます。 現在、ワークスペースには、以下の複数のプロジェクトがあります。 ・Mainとなるプロジェクト ・上記のMainプロジェクトがDependしている、DLLのプロジェクト 問題は、DLLプロジェクトに新しいClassを追加したところ、単体でビルドすると成功するにもかかわらず、MainプロジェクトをActiveにしてリビルドしたときに、新しく追加したClassだけが下のように未解決にされてしまうということです。 ”error LNK2001: 外部シンボルXXX(追加したクラスのコンストラクタ)は未解決です” このClassはDLLの内部で使用されており、Mainプロジェクトから直接呼ばれるClassではありません。また、このClassの使用箇所をDLLのソースからコメントアウトすると、リンクエラーは解消されます。 VC++に不慣れかつ、他人の作ったプロジェクトなこともあり、現在の設定内容がいま一つわかっていないところがあります。問題はそのあたりだと思うのですが、はっきりしません・・・。 調べてわかっていることは、以下です。 ・Mainプロジェクトから呼ばれるDLLのHeaderファイルにはパスが通っている。 ・Mainプロジェクトから呼ばれるDLLのLibraryにはパスが通っている。また、#pragmaによりリンクされている。 ・Mainプロジェクトから呼ばれるDLLにはパスが通っている。 ここを確認してみたらどうか?など、ヒントをもらえたらありがたいです。 よろしくお願いいたします。