2011-08-04 16 views
3

std :: stringクラスから継承するのは良い考えではありませんが、継承を使ってダミーの代入を行うためのカスタム関数を文字列クラスに追加しようとしていただけです。 私はstradd(str1、str2)を実行すると、私の関数を 'add'として呼び出すことができます。文字列の先頭にstr1を追加し、文字列の最後にstr2を追加する必要があります。このクラス(継承された文字列クラス)は、別のクラスのプライベートメンバクラスです(Parentなど)。これで私の文字列クラスオブジェクトにアクセスしようとすると、Parentクラスを指します。これどうやってするの?関数を文字列クラスに追加する

おかげ

+1

おそらく、コードサンプル? - とにかく 'void結合(std :: string&body、const std :: string&prefix、const std :: string&suffix);はどうでしょうか。文字列を継承すると値は追加されません。なぜなら、実装のためにパブリックインターフェイスを使用する必要があるからです。 – UncleBens

+0

'str1 + str + str2'? – GManNickG

答えて

0

は、私はこのような外部関数は、文字列継承の全体的なアイデアを避け、より良いかもしれないと思います

クラスのパブリックセクションに関数を宣言してください。

たぶん、あなたが相続以上の組成を大好きだ;)

class MyString 
    { 
      std::string m_string; // do not inherit just composition it 
    public: 
      explicit MyString(const std::string& str) 
        : m_string(str) 
      { 
      } 

      // your function should be in public scope I think 
      MyString& add(const std::string& begin, const std::string& end) 
      { 
        m_string.insert(0, begin); 
        m_string.append(end); 
        return *this; 
      } 

      const std::string& string() const 
      { 
        return m_string; 
      } 
    }; 

    class Parent 
    { 
      MyString m_string; 
    public: 
      void surround(const std::string& begin, const std::string& end) 
      { 
        m_string.add(begin, end); 
      } 
    }; 

    int main(int argc, char *argv[]) 
    { 
      std::cout << MyString("inherit").add("Do not ", " from std::string!").string() << std::endl; 
      return 0; 
    } 
2

は本当に悪い考えであること、std::stringから継承しません。 std::stringには仮想デストラクタがないので、適切なコンストラクタを記述し、多態性とともに使用しないでください。無料の関数を書くだけです。

3

私はあなたの質問のすべての側面を理解しているかどうかはわかりません。プライベートメンバークラスとは、プライベートメンバー変数を意味しますか?それとも、それは個人的に継承していますか?私は理解できません "これで私の文字列クラスオブジェクトにアクセスしようとすると、それはParentクラスを指しています"。

std :: stringを継承している方が良いでしょう。まず、派生した文字列のメンバーにするには、基本的な実装についてかなり知っておく必要があります。これは配布から配布に変わることがあり、コードは移植できません。とにかく、実際の最適化を利用することはできません。これに本当に良い理由がない限り、あなたはそれをやっていないほうが良いです。

第2に、あなたがやっていることを説明していないように、「add」という名前はおそらく最高ではありません。 「サラウンド」はより良い名前かもしれません。 、あなたがより高いパフォーマンスをしたい場合は、

void surround(std::string &orig, std::string const &pre, std::string const &post) { 
    orig = pre + orig + post; 
} 

またはこのような何か:

void surround(std::string &orig, std::string const &pre, std::string const &post) { 
    std::string str; 
    str.reserve(orig.size() + pre.size() + post.size()); 
    str.insert(str.end(), pre.begin(), pre.end()); 
    str.insert(str.end(), orig.begin(), orig.end()); 
    str.insert(str.end(), post.begin(), post.end()); 
    std::swap(str, orig); 
} 
+0

迅速な返信をありがとうございました。 – keeda

+0

パフォーマンスを向上させるために、文字列の4番目の一時インスタンスを作成する必要はありません。 ro 'orig'の前に追加して追加することができます。 –

+0

できますが、より多くのメモリ割り当てとコピーが必要です。パフォーマンスが低下します。 – graphicsMan