クラス内のクラスからメソッド呼び出しでエラーが発生する

このQ&Aのポイント
  • クラス内のクラスからメソッド呼び出しをする際にエラーが発生してしまいます。解決策を教えてください。
  • クラス内のクラスから別のメソッドを呼び出したいですが、コンパイルエラーが発生してしまいます。
  • クラス内のクラスからメソッドを呼び出す方法を教えてください。
回答を見る
  • ベストアンサー

クラス内のクラスから1つ目のクラスのメソッドよ呼び出しがうまくいきません^^;

こんにちは、ちょっと分かりにくい質問なんですが。 class c1 {   int k1();   class c2   {     int k2();   }; }; と言うのがあったとします。 そこで、k2の関数の内部でk1を呼び出したいのですが、 int k2() {   return c1::k1(); } 見たいな事をすると、「静的でない関数の呼び出しが正しくありません」とエラーが出てしまい、コンパイルできません・・・ だからといってk1をc1の外に出してしまうとc1の変数にアクセスできなくなってしまうため、それはできません。 何かいい方法はないでしょうか・・・解決策をお待ちしていますm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

クラスの設計がちょっと駄目です。 c2からc1::k1にアクセスしたいなら、 c2がc1のポインタを持つか、k1をstaticメンバにします。 ちなみにstaticメンバはCの関数と同じただの関数でメンバ変数にアクセスできません。 またこの場合c2を内包する意味がありません。 class c1 {   int k1();   int k2(); }; でいいのです。 return c1::k1(); これが何故だめか、ですが c1は実体がありません。その為staticメンバ(静的な関数)である必要があるのです。 class c1 {   static int k1();   class c2   {     int k2();   }; }; int c1::k1() { return 0; } int c1::c2::k2() {   return c1::k1(); } 一応これでコンパイルは通りますが。

genki140
質問者

お礼

そうだったんですか!! できました^^ありがとうございましたm(_ _)m

関連するQ&A

  • クラスのメンバ関数の呼出しについて

    こんにちは。 初心者ですが、よろしくお願いします。 MFCを使用してダイアログベースのアプリケーションを作成しています。 <ヘッダ> class Sample : public CDialog { (略) public: int SampleA(CString); (略) <ソース> UINT SampleB(LPVOID pParam) { int n; n = Sample::SampleA(CStringA) ←エラー return 0; } メンバ関数ではない、SampleBから、上記のように呼出すと、「静的でないメンバ関数の中で呼び出しが正しくありません。」というエラーが表示されてしまいます。 ヘッダ内のメンバ関数宣言をstaticにすれば問題は解決できるのですが、このやり方しかないのでしょうか。 よろしくお願いします。

  • CからC++の関数呼び出し

    CからC++の関数を呼び出して値を取得したいのですが、コンパイルエラーになってしまいます。 呼び出す関数内でさらに同じクラスの関数を呼び出して値をreturnしたいだけなのですが、 ご教示願います。 ソースは下記のような感じです。 Cソース(AAA.c) main(){ ・・・・・ if ( funcA() ){ ・・・・ } } C++ソース(BBB.cpp) int clsB::funcB { return iflg; } extern "C" { int funcA() { return funcB(); } } ※上記externは特に何かの関数内に書いているわけではありません。 C++ヘッダ(BBB.hpp) class clsB : public XXX { private: int iflg; ・・・・ public: int funcB(); ・・・・ } 上記にコンパイルすると、 externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。 ラッパ関数を使って使用するなどと聞いたのですが、やり方がいまいちわかりません。 どうか教えていただけますでしょうか。 また、他にやり方があるかと思いますが、いいやり方があれば教えていただけると幸いです。 以上です、よろしくお願いいたします。 不足内容あれば指定願います。

  • 親クラスのポインタで派生クラスの関数呼び出し

    下記のようなクラス構成があるとします。 説明のため簡略化しています。 [Test.h] class CParent { protected: int nParent; public: CParent(){nParent = 10;} ~CParent(){}; virtual int func1(){ // (*1) return nParent; } }; class CSub : public CParent { int m_nSub1; // 派生クラスにしかないメンバ変数 int m_nSub2; // 派生クラスにしかないメンバ変数 public: CSub(){m_nSub = 20;} ~CSub(){}; int func1(){ // (*3) return nParent*2; // 20 } // 派生クラスにしかないメンバ関数 int func2() // (*4) { m_nParent; // 10 return m_nSub1; // 不定値 } int SetData(int n) // (*5) { m_nSub2 = n; return m_nSub2; } }; [Test.cpp] void main() { CParent parent; // 親クラスのオブジェクト CParent* pParent = &parent; // 親クラスのオブジェクトを指すポインタ int nRet = 0; nRet = pParent->func1(); // (*1) // サブクラスのポインタ型にキャストする CSub* pSub = (CSub*)pParent; // (*2) nRet = pSub->func1(); // (*3) nRet = pSub->func2(); // (*4) nRet = pSub->SetData(60); // (*5) } (*3)ではpSubの指すオブジェクトが親クラス(CParent)のため、ポリモーフィズムのメカニズムに従ってCParent::func1()が呼ばれ10が返ってきます。ここまでは想定通りです。 次の(*4)ですが、これはCSub::func2()が呼ばれています。なぜこの呼び出しで子クラスの関数を呼ぶことが出来るのでしょうか? 実際その動作をさせたいのですが、なぜそうなるのかが分かりません。想定ではpSubが指す先は親クラスのため、子クラスにしかないメンバ関数func2()は呼べないはずです。 このコードでは、CSubのコンストラクタは通りませんので(そもそもCSub型のインスタンスは実体化していない)、(*4)の呼び出しでは不定値が返ります。また、(*5)は期待通り動作し、戻り値60が返っています。 これは危険な事をしているのでしょうか? 期待通りではあるのですが、なぜこのような動作になるのか理解できません。 上記のようなことをしたい場合、どのように記述するべきでしょうか?

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • 変数によるクラスの呼び出しができない

    変数によるクラスの呼び出しができません。 <?php class test { public function test_method () { $return = "test"; return $return; } } $test1 = 'test'; $test2 = 'test_method'; new $test1; echo $test1::$test2 (); ?> 問題が起こっているのは new $test1; echo $test1::$test2 (); の部分の$test1をtestに変更する事で正しく動作します。 実際に使う時には$_GETの入力値から呼び出すクラスの変更を行おうと考えています。 セキュリティー対策として登録済みクラスの対応表を使っての呼び出しを行っているので対応表を if ($_GET["~"] == ~) { new ~; ~::test(); } else... のような形式に出来ないわけではないですが対応表自身が変動する為この方法では対応表の書き換えが大変困難なものになってしまいます。 変数を使った呼び出しの方法は無いもなのでしょうか。 環境はWeb ServerがApache 2.2.0,PHPが5.1.4の状態でmod_suPHP 0.6.1を使っています。

    • ベストアンサー
    • PHP
  • templateクラスについて

    先ほど以下のようなプログラムを書いたのですがコンパイルを通すことができません。 //適当なポインタを保持するだけのクラス template <class _type> class hoge { private:   //適当に変数を保持   _type val; public:   //コンストラクタで適当に値をセット   hoge() : val( 0 ){}   //このクラスから唯一ポインタを引っ張ってくる方法   friend _type getVal( const hoge& foo )   {     // そのまま返す     return foo.val;   } }; void func( const hoge<int>& foo ) {   //値を引き出す   getVal( foo ); } void main() {   //実体化   hoge<int> foo;   //値を引き出す   getVal( foo );   //関数の先で値を引き出す   func( foo ); } 上記のようなプログラムを書いたのですが、main関数内でgetValを呼び出す場合はとくに問題ないのですがfunc関数を呼び出してfunc関数内でgetValを呼び出すと error C3861: 'getVal': 識別子が見つかりませんでした error C2365: 'getVal' : 再定義; 以前の定義は '以前は不明な識別子' でした。 コンパイルされたクラスの テンプレート のインスタンス化 'hoge<_type>' の参照を確認してください というエラーが出てしまいます。 func関数の引数を( const hoge<int>& foo )からvoid func( hoge<int> foo )のように参照渡しから実体渡しに変更するとコンパイルが通り、実行もできるのですが、なぜこれでコンパイルが通るのか理由がいまいちよくわかりません。 またやはり、コンストラクタ、デストラクタの問題などから実体渡しより、参照渡しを使いたいのですがどのようにプログラムを書けば今回の問題を解決できますでしょうか。 よろしくおねがいします。 /* VisualStudio2005 AcademicEdition MicroSoft WindowsXP Professional 32bit */

  • テンプレートクラスでのクラス変数

    テンプレートから生成したクラスごとにクラス変数を設けて、 かつ、クラス変数の初期化をいちいちやらなくてもよい という状況を作りたいと考えています。 そこでたとえば template <int N> class test { public: static int class_var() { static int class_var_ = N; return class_var_; } }; としたとき test<1>::class_var() と test<2>::class_var() はどのような値になるのでしょうか? VC++ではテンプレート全体で class_var_の値が同じになってしまうようのなのですが。。。 そもそも、こういうクラス変数自体を つくろうという考えが間違っているのでしょうか? どなたかご存知でしたらお教えください。

  • C++ 継承したクラスのメソッド呼び出し

    C++で以下のようなコードを組んでいます。 // Class定義 CSuper{ public: Method1(int a); }; CSub : public CSuper{ public: Method1(int a); }; // インスタンス CSuper ins1; CSub ins2; // 管理テーブル struct _table{ int id; CSuper* p; }; // テーブル定義 _table Table[] = { {0, &ins1}, {1, &ins2} }; // 処理 int main(void) { int i; for(i = 0; i < 2; ++i) { Table[i].p->Method1(i); } return 0; } //////////////////////////// このときに、i=1のときは、p = &ins2となるので、 CSub::Method1() が呼ばれることを期待しているのですが、 i=0でもi=1でも、CSuper::Method1() が呼ばれてしまいます。 何か記述が間違っているでしょうか? または、認識が間違っているでしょうか? ご教示のほどよろしくお願いいたします。 環境:依存がないと思っています。 (VC++2008, Cygwin gcc, Fedora4 gcc で確認しましたが同じ結果)

  • 再帰呼び出しの計算量

    再帰呼び出しを用いた関数の計算量を求める方法がわからないので質問させていただきます. xのn乗を再帰呼び出しを用いて求める関数に関して,計算量を求める問題なのですが,どのような方針で求めればよいのでしょうか? int exponent(int x, int n) {   if(n == 0){     return 1;   }else{     return x * exponent(x, n-1);   } } exponentがn回呼ばれるからO(n)というのは間違いでしょうか?

  • 戻り値がクラスオブジェクト

    VB初心者でわからないので教えてください。 ある関数を呼び出して戻り値を取得するのですが、その戻り値がクラスオブジェクトとなっています。いろいろ調べてみましたが、いい結果にヒットしなかったので今回質問してみました。 言語はVB6.0です Function 関数A(A as String, B as String) dim C as Class1 set C = new Class1 Class1で宣言された変数に値を入れる処理     関数A = C end Function イメージはこんな感じです。 すみませんが解決策を教えてください。。。。

専門家に質問してみよう