クラスインスタンスなしでC ++クラスメソッドを呼び出しますか? -- c++ フィールド と class フィールド と methods フィールド と instance フィールド と call フィールド 関連 問題

Call a C++ class method without a class instance?












3
vote

問題

日本語

ロングストーリーの短い、Cメイン関数からC ++ソースコードにアクセスするためのラッパーを構築しようとしています(私は組み込みシステムのために変換をしなければなりません)。ただし、そのクラスのインスタンスを作成せずに、クラスから外部関数へのメソッドを呼び出すのに問題があります。

この *side ポインタをCコードから渡したい場合は、そのキューブを計算し、立方体値を返します。私は単純なポインタ機能と変数を使って私のラッパーをテストし、それは完全にうまく機能しますが、私はクラスメソッドに問題があります。これは私のソースコードですが、私が最後の行を作っている間違いで...:

<事前> <コード> class Cube { public: static int getVolume(int *side) { return *side * *side * *side; //returns volume of cube } }; void Cube_C(int *side) { return Cube.getVolume(*side); }
英語

Long story short, I am trying to build a wrapper to access C++ source code from a C main function (I have to do the conversion because of Embedded systems); however, I am having trouble calling the methods from the class to an external function without creating an instance of that class.

I want to pass this *side pointer from my C code, calculate the cube of it, and get returned the cubed value. I have tested my wrapper with simple pointer functions and variables and it works perfectly fine, however I am having trouble with class methods. Here is my source code to that, with the mistake I am making on the last line...:

class Cube { public:     static int getVolume(int *side)     {         return *side * *side * *side;     //returns volume of cube     } };  void Cube_C(int *side)  {     return Cube.getVolume(*side); } 
</div
              
     
     

回答リスト

4
 
vote
vote
ベストアンサー
 

インスタンスなしでクラスの static メンバ関数を呼び出すことができます。クラス名とそれに続くスコープ解決演算子 )試した)

また、<コード> Cube_C 関数では、 side 関数として side ポインタをではありません。引数として int * ポインタを取ります。そして、その関数の戻り型を int として宣言する必要があります( void Item_Bound(Object sender, DataGridItemEventArgs e) { if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { Integer intButtonColumn = ### Button btn = e.Item.Cells[intButtonColumn].FindControls[0]; btn.Visible = IsUserInRole(); } } 0 ):

 <コード> 99887776611  
 

You can call a static member function of a class without an instance: just add the class name followed by the scope resolution operator (::) before the member function's name (rather than the class member operator, ., as you have tried).

Also, in your Cube_C function, you should not dereference the side pointer, as the getVolume function takes a int * pointer as its argument. And you need to declare the return type of that function as an int (not void):

int Cube_C(int *side)  {     return Cube::getVolume(side); } 
</div
 
 
   
   
2
 
vote

この特定の例では、 void Item_Bound(Object sender, DataGridItemEventArgs e) { if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { Integer intButtonColumn = ### Button btn = e.Item.Cells[intButtonColumn].FindControls[0]; btn.Visible = IsUserInRole(); } } 2 は状態を保持していないため、クラスになる必要はありません。関数を作るだけです:

<事前> <コード> void Item_Bound(Object sender, DataGridItemEventArgs e) { if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { Integer intButtonColumn = ### Button btn = e.Item.Cells[intButtonColumn].FindControls[0]; btn.Visible = IsUserInRole(); } } 3

状態をCから再利用できるようにするオブジェクトが必要な場合は、インスタンスが必要です。

<事前> <コード> void Item_Bound(Object sender, DataGridItemEventArgs e) { if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { Integer intButtonColumn = ### Button btn = e.Item.Cells[intButtonColumn].FindControls[0]; btn.Visible = IsUserInRole(); } } 4

それからあなたのCインターフェイスで:

<事前> <コード> void Item_Bound(Object sender, DataGridItemEventArgs e) { if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { Integer intButtonColumn = ### Button btn = e.Item.Cells[intButtonColumn].FindControls[0]; btn.Visible = IsUserInRole(); } } 5

編集: github には、以下のように追加されました。 C ++オブジェクトを作成して操作します。

 

For this particular example, you don't need them to be classes at all since Cube doesn't hold a state. Just make a function:

int Cube_Volume(int side) { return side * side * side; } 

If you want objects that holds a state to be reusable from C, you do need an instance:

class Cube { public:     Cube(int side) : m_side(side) {}     int getVolume() const { return m_side * m_side * m_side; }  private:     int m_side; }; 

Then in your C interface:

extern "C" int Cube_Volume(int side) { return Cube(side).getVolume(); } 

Edit: I added a more verbose example at github to show how you can create C functions to create and manipulate C++ objects.

</div
 
 
         
         

関連する質問

0  C#で統合を使用せずにDLLファイルを呼び出す方法  ( How to call dll file without using statment in c sharp ) 
using statement を使用せずに、C#メインプロジェクトからC#で書かれたDLLを呼び出す方法 VBの<コード> CreateObject(servername.typename[,location]) のように。 ...

-1  PHPでそのようなCallCenter関数を実装する方法  ( How to implement such a callcenter function in php ) 
それはこのようなものであるべきです: <事前> <コード> function callcenter($func,$value,$position) { } ここで、$ funcは呼び出される関数、 $ valueは$ func、のパラメータです。 と$...

35  JavaScript:Ajaxリクエストを検出します  ( Javascript detect ajax requests ) 
General JavaScript(フレームワークではなく)汎用JavaScriptを使用して、グローバルAJAX呼び出し(特に応答)を検出する方法はありますか? 私はすでに質問を見直しました " ajaxイベント"を検出する、ここではstackoverf...

1  iPhone - 呼び出しを配置できるかどうかを確認  ( Iphone check whether call can be placed or not ) 
私はたくさん順番になり、オペレータの信号が存在するかどうかを見つけることができないことがわかりました。しかし、私が電話をかけることができるかどうかを見つけるための有効なAPIはありますか? ...

0  Call.Prototype.toStringとの有無にかかわらず  ( Object prototype tostring with and without call ) 
誰かが次のような結果を生み出す理由を説明してください。私はこれを研究しようとしましたが、まだ良い説明が見つかりません。 Object.PrototypeのToStringの呼び出し1プロダクション: <事前> <コード> Object.prototype.t...

1  PowerShellからSQL * Plusを実行します  ( Execute sqlplus from powershell ) 
C: empSQLalex.sql および C: empalex.ps1 に2つのファイルを取得しました。 C: empSQLalex.sql の単純 <事前> <コード> select count(*) from user_tables; quit; ...

0  VRMLScriptからPHPスクリプトに接続する方法  ( How can i connect to php script from vrmlscript ) 
VRMLスクリプトからPHPスクリプトに接続したい。出来ますか?出力をVRML変数に戻すには。 X3Dの例をいくつか見た、それは近いですが、それほど正確ではありません。 <事前> <コード> Script { url [ "...

1  Railsはメソッドfind_for_authenticationが呼び出されないようにします  ( Rails devise method find for authentication not being called ) 
私はマルチテナントアプリケーションを持っています。ここで、すべてのユーザーは異なるサブドメインで異なる役割を持つことができます。テーブル、ユーザー、役割を結ぶテーブルuserrigreがあります。ユーザーが特定のテナント/サブドメインの登録を持っているかどうか...

1  PythonからSQLite3の指示を呼び出すことは可能ですか?  ( Is it possible to call sqlite3 instrucations from python ) 
PythonスクリプトからSQLite3の指示を呼び出したいと思います。 説明書 Iを意味します: .help .schema .mode sqlite3ユーティリティの ".help"によってリストされていると残りの指示。 Python ...

2  BlackBerryで発信通話を傍受します  ( Intercept outgoing call in blackberry ) 
次のことを行う方法を探しています。 BBを持つユーザーは番号を入力します(または連絡先を選択して[Send] 'をクリック) バックグラウンドでのアプリはコールイベントを検出します 私たちのアプリは何かをします(例えば、電話をブロック/さまざまな数の電話を...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有