2011-08-04 12 views
3

私は、次のコードを持っている:C++クラス変換は可能ですか?

class B { 
public: 
    B(const std::string& str):m_str(str) { } 
    B(const B& b):m_str(b.m_str) { } 
    B& operator=(const B& b) { m_str = b.m_str; return *this; } 
private: 
    std::string m_str; 
}; 

main() 
{ 
    std::string a = "abc"; 
    B b(a); 
} 

クラスBは、クライアントに属します。私はそれを変更することはできませんし、その特定の名前( "B"は単なる例です)を知らないかもしれません。私が知っていることは、コンストラクタのstd :: stringを受け入れるクライアントクラスがあることです。今私はSTDから "" メインで()の種類を変更したい::以下に定義するAに文字列、:

class A { 
public: 
     A(const std::string& str):m_str(str) { } 
     A(const char *str):m_str(str) { } 
     A(const A& a):m_str(a.m_str) { } 
     A& operator=(const A& a) { m_str = a.m_str; return *this; } 

private: 
     std::string m_str; 
}; 

は、だから今、私は(新しいメインを持っている):

main() 
{ 
    A a = "abc"; 
    B b(a); 
} 

これはそのままコンパイルできません。新しいmain()を変更せずにできることはありますか?私はクラスBを変更することはできませんし、クラスAはクラスBを決して参照するべきではありません。 ありがとう!

+0

"新しいmain()を変更せずに"なぜですか? –

答えて

1

どの程度

int main() //note the correct declaration of main 
{ 
    A a = "abc"; 
    B b(a.GetString()); //GetString returns m_str; 
} 

ところで、コピーコンストラクタのすべてのあなたの定義とコピー代入演算子を、コンパイラがあなたのために自動生成されただろうな定義と一致します。

編集
私はちょうどmain()は変更されないことを、あなたの制約に気づきました。この場合、Aから文字列までconversion functionを定義することができます(ただし、危険な場合があります)。

class A 
{ 
    ... 
    operator std::string() const {return m_str; } 
}; 
3

として、ユーザー定義の変換機能を追加します。これは、あなたがこれらを書くことができます

class A 
{ 
public: 
    //other code 
    operator std::string() 
    { 
     return m_str; 
    } 
    //... 
}; 

B b(a); //which is what you want 
std::string s = a; //this is also okay; 

void f(std::string s) {} 

f(a); //a converts into std::string, by calling user-defined conversion function 

あなたがこの書き込むことはできませんが、以下の理由

const A ca("hi"); 
std::string s = ca; //error 

そのをcaconst非constユーザー定義変換関数を呼び出せないオブジェクト。

注意ユーザ定義の変換関数は、元の文字列のコピーを返す意味値によってストリングを返します。これであなたはこれを書くことができ、

operator const std::string &() const 
{ 
    return m_str; 
} 

:だから、としてそれを定義することによってこの問題を回避することもできます

const A ca("hi"); 
std::string s = ca; //ok 

A a("hi"); 
std::string s = a; //ok 
+1

よろしく!私の悪い!私はAからBへの変換関数を書いていますが(これは許されません)、何らかの理由で簡単な解決策が私を逃れました。ありがとう! – kc66

5

class A { 
public: 
    .... 
    operator const std::string() 
    { 
     return m_str; 
    } 
+0

ユーザー定義変換関数と呼ばれます。 – pmr

+1

キャスト演算子:()(http://msdn.microsoft.com/en-us/library/ts48df3y(v=VS.80).aspx)。それは同じことのための別の名前です。 – cprogrammer

0

キャスト演算子を追加したクラスにこれを追加しますA:

operator std::string() { return m_str; } 
関連する問題