2017-05-11 12 views
0

「X」コードとインターフェイスするC++コードがあります(X11のように)。いずれかの呼び出しでは、paramを文字列へのポインタのアドレスにします。コールは、カウントされた文字列を取得するように設定されています。この場合、1つの文字列(ホスト名から派生したwinname)しか使用されません。どのような場所で、現在ではの線に沿って何かされていますC_stringへのポインタへの参照を返す方法をカプセル化するには?

char winname_[257]; // to hold Cstr returned by gethostname() 
string windowName{}; // holding string version (prefer strings, but need 
         // Cstr's for C-compat in places) 

が機能しておいてください。Xfuncに渡す

string XWin::WindowName(string name) { 
    if (name.size()) windowName = name; 
    if (!windowName.size()) { 
    gethostname(winname_, sizeof(winname_)-1); 
    windowName = getResourceOrUseDefault(string("title"), string(winname_)); 
    strcpy(winname_, windowName.c_str()); 
    } 
    return windowName; 
} 

inline char * winname() {if (!winname[0]) WindowName();return winname;} 

を、私が必要:

char * winname_p = winname_; 

X機能がかかりますので:

Xfunc(&winname_p, 1, et, al.) 

私は、関数内に "winname_p"参照をカプセル化することができるので、私はwinname_p[0] != 0をチェックして関数をポインタを返すことができるが、今のところ関数を返すことに失敗している lvalue私はそれがwinname_pする左辺値を返すので、 その関数の戻り値の構文を考え出したていない

Xfunc(&winname_ptr(),1, et,al.)... 

:私はのようなものを持つことができます。私はこれが簡単だと確信しています 多くの場合、私はいくつかのブロックを持っているようですが、ポインタになると&機能。

答えて

1

多くのことと同じように、答えを知ると簡単です。その後

char * const winname_p{winname_}; 

ラッパー::

char * const &XWin::winname_ptr(void) { 
    if (!winname_[0]) WindowName(); 
    return winname_p; 
} 

と使用方法:

if (XStringListToTextProperty(
    const_cast<char **>(&winname_ptr()), 1, &title_) == 0) {...} 

がされていたであろう はCONST(これは変更すべきではありません示すために)としてポインタを初期化しますconstを使用しない方が簡単ですが、この方法ではより正確です。

関連する問題