• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:続・複数のアドレスを関数から取得したいのですが)

関数から複数のアドレスを取得する方法

このQ&Aのポイント
  • 関数から複数のアドレスを取得する方法を教えてください。
  • クラスから複数のアドレスを取得する方法を知りたいです。
  • 複数のアドレスを取得するための方法を教えてください。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

ポインタの使い方を完全に間違っています。 data.Syutoku(test1,test2); でポインタを引数にしてますが、これはポインタ変数に入っている値を渡しているだけポインタ変数自身のアドレスを渡していません。 data.Syutoku(&test1,&test2); が正しいです。 受けるほうも、 Syutoku(int **in_test1,int **in_test2); で、代入は、   *in_test1 = &data1;   *in_test2 = &data2; が正解です。 それはそれとして、インスタンスのメンバ変数のアドレスを外部に返す仕様はメンバ変数をprivateにしている意味がありません。メンバ変数をpublicにする方がましです。 さらにオブジェクト指向として考えた場合のカプセル化という思想に反しますので、加工処理自体を呼び元ではなくクラスの中に隠蔽できませんか?

takuya245
質問者

お礼

zwi様早速の回答本当にありがとうございます。 おかげで問題も解決しました。 ご指摘のことですが、自分も本当ならこんな方法はとりたくはなかったのですが、どうしてもアドレスでのデータ参照が必要不可欠だった為やむなくの判断です。 ポインタといい構築能力といい1から10まで勉強不足であることがよくわかりました(笑) 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 複数のアドレスを関数から取得したいのですが

    関数から複数のアドレスを取得したいのですが方法がわかりません。 間違いではありますがイメージとしてはこういうことが行いたいのですが。 void main(){   int *test1,*test2;   Test(test1,test2); } void Test(int *in_test1, int *in_test2){   int data1,data2;   data1 = 1;   data2 = 2;   in_test1 = &in_test1;   in_test2 = &in_test2; } 結果的にmain関数のtest1とtest2にTest関数のdata1とdata2のアドレスが入るようにしたいのです。 ご教授願います。

  • 関数ポインタ?

    下記のようにstaticでないメンバ関数を 関数ポインタのように指定できることを最近知ったのですが 下記コードにでてくるfpは一般的に何と呼ばれるのでしょうか? これも「関数ポインタ」で良いのでしょうか? この事について調べたかったのですが、呼び方がわからず 検索できなかったのでここで質問している次第です。宜しくお願い致します。 #include <iostream> class CTest{ public:   int a;   CTest(int _a){ a=_a;}   int fnc(int test){     return a + test;   } }; int main() {   CTest* test = new CTest(3);   int (CTest::*fp)(int) = &CTest::fnc;   std::cout << (test->*fp)(5) << std::endl;   return 0; }

  • スプレッドシートのGASの関数で複数戻り値取得

    googleのスプレッドシートを使っています。 Google Apps Scriptでデータの取得を行っているのですが、 1つの関数から複数の戻り値を得るような方法はありますでしょうか? マイコンのC言語などをやった際に、ポインタ変数を関数の引数に設定して、その関数の引数に配列変数などをアドレス指定で設定することで複数の戻り値を得るような方法があったと思うのですが、GASでも同様の方法などはありますでしょうか? どうぞ、ご教示の程よろしくお願い致します。

  • メンバ関数のconst

    class CTest { public: int Fnc() const { return 1; } int Fnc() { return 0; } }; どうでもいい質問かもしれませんが このクラスのFnc()を呼んだ場合 return 0のメソッドが 呼ばれました。(gcc3.4,bcc5.5,VC++7.1共に) const( return 1 )の方を明示的に呼び出す事は可能でしょうか?

  • VC6でDLL(COM+)作成中にエラーが出ました。

    VC6でATL COM AppWizardでDLLを作成しています。 インターフェースメソッドを追加したところ、 (1)の場合はうまくいきましたが、(2)の場合は、エラーと警告が2つ出ました。 理屈がわかっていないので対処方法がわからないのですが、何が原因なのでしょうか? やりたいことは、戻り値1つでなく、3つの戻り値が必要で、 引数4つのうち、最初は関数へ計算の元となる文字列を送り、残りの3つはint型ポインタを与えて、関数内で結果をセットし、呼び出し元でも使えるようにしたいので、このようにしました。通常のC?ではうまくいっていました。 あと読んだ方が良い書籍も探しています。 COM+?について詳しい方、教えてください。 ※COM+というのはVB2005やC#でも健在なのでしょうか? (1) 戻り値のタイプ: HRESULT メソッド名: Test1 パラメータ: なし (2) 戻り値のタイプ: HRESULT メソッド名: Test2 パラメータ: [in] char* a, [in,out] int* b, [in,out] int* c, [in,out] int* d →※ここが間違い? ===== エラー内容 ===== error C2259: 'CComObject<class CTest>' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 warning C4259: 'long __stdcall ITest::Test2(unsigned char *,int *,int *,int *)' : 純粋仮想関数は定義されていません。 'Test2' の宣言を確認してください。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 error C2259: 'CComObject<class CTest>' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 warning C4259: 'long __stdcall ITest::Test2(unsigned char *,int *,int *,int *)' : 純粋仮想関数は定義されていません。 'Test2' の宣言を確認してください。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中

  • C++のクラスの可変引数化を禁止する方法。

    C++のクラスの可変引数化を禁止する方法。 クラスのインスタンスをprintfの引数にするのをコンパイル・エラーにする方法はないでしょうか? コピーコンストラクタや代入のオーバーロードをprivateにしてもエラーが出ないので方法を探しています。 #include "stdafx.h" class CTest { private: int intdata; public: CTest() : intdata(0) { }; private: void operator =(const CTest& src) {} CTest(const CTest& src) {} }; int _tmain(int argc, _TCHAR* argv[]) { CTest ctest; printf( "%s %p\n", ctest, ctest ); return 0; }

  • 関数の戻り値に関数のアドレスを返すできませんか?

    戻り値に関数のアドレスを与える方法が良く分かりません. ひとまず,以下のように動くプログラムを作りたいと思っています.  f2(1,2)(1); //このように引数の()を二種類に分けたいのですが 無理でしょうか?? プログラムは下のように作って実験しているのですが良く分かりません・・ どなたか分かる方居たら教えてください. int f1(int x , int y){ return 0; } ????? int ff(int x){ return f; };

  • 仮想関数について困っています

    仮想関数について困っています C++を現在勉強中でその中で困ったことができました。 仮想関数についてまだ分かっていないことが多いのですが、一応以下のように使うものだと学びました。 class test{  public:   virtual void run(){    std::cout<<"testクラス"<<std::endl;   } }; class test_sub:public test{  public:   void run(){    std::cout<<"test_subクラス"<<std::endl;   } }; int main(){  test *t_s;  t_s=new test_sub;  t_s->run(); } ※includeは省略させていただきます こうすれば「test_subクラス」と出力されるはずです。 そこで本題なのですが自作のarrayクラスのようなものはテンプレートクラスになっているのですが array<test*> data; data[0].run(); のように使うと「testクラス」と表示されてしまいます。 これを解決する方法は何かないでしょうか? ご存じの方がいましたら教えていただけると助かります。

  • 多重delete

    最近デバッグをしていて気づいたのですが、引数がクラスのときはコンストラクタが呼び出されないようなのですが、そうするとデストラクタだけ余分に呼び出されてしまいます。NULLを入れるというのも検討しましたが、もし忘れたときのことも考えると、ほかに良い方法がないものかと思いました。 コード例 class Test{ public: void Compare(class Data Data1,class Data Data2); }; class Data{ private: int *Data; public: Data(){Data=new int[10];} ~Data(){delete[] Data;} }; 上記のようなコードで、Compareを呼び出したときはDataのコンストラクタは呼ばれていませんが、Compareを抜けたときにはデストラクタが呼ばれているようです。 勉強も兼ねて、vectorの代わりになるものを作っていたのですが、どうやら同じポインタにdeleteが複数回呼ばれているようで、エラーが出てしまいます。 もし良い解決策が分かる方いましたら、回答よろしくお願いします。

  • あるならばそのアドレスを取得したい

    シートに目的の文字があるのならば、そのセルのアドレスを取得したいのですが いつも$1:$1048576が返されます。 コードは、 Function test() With Sheets("Sheet1") If Not .Cells.Find(What:="aaa") Is Nothing Then 'あるならば Debug.Print .Cells.Address End If End With End Function です。 aaaはA3にあるとします。 なので、A3という戻り値がほしいのですが、いつも決まった値が返ってきてしまうので、 見つかったセルの値を取得する方法を教えてください。

このQ&Aのポイント
  • TS-8530プリンターの専用インクであるBCI-331.330は入手が難しいため、代替品のBCI-381.380の使用について疑問がある。
  • BCI-381.380をTS-8530プリンターに挿入した場合、印刷はできるがインクの情報表示やプリンターの故障の可能性がある。
  • TS-8530プリンターのインクに関する疑問について詳しい情報を教えてください。
回答を見る