1

Accelerated C++、演習 14.5 にはsplit関数の再実装が含まれます (テキスト入力を文字列のベクトルに変換します)。std::string- のようなクラス ( Str)でストア入力を使用し、関数を使用して、- のようなコンテナーであるsplitを返す必要があります。このクラスは、基になる へのカスタム ポインタ ( ) を管理します。Vec<Str>Vecstd::vectorStrPtrVec<char> data

このStrクラスは、以下のようにコンストラクターを提供Str(i,j)Str.hます。これPtrは、基礎となるを構築し ます。問題が発生するコードで詳しく説明したVec 呼び出しによって部分文字列を作成しようとすると、問題が発生します。str(i,j)これは、クラスの簡略化されたバージョンですStr(必要に応じて、より多くのコードを投稿できます)。

Str.h

#include "Ptr.h"
#include "Vec.h"


class Str {
    friend std::istream& operator>>(std::istream&, Str&);
public:

    // define iterators

    typedef char* iterator;        
    typedef char* const_iterator;  

    iterator begin() { return data->begin(); }
    const_iterator begin() const { return data->begin(); }

    iterator end() { return data->end(); }
    const_iterator end() const { return data->end(); }

    //** This is where we define a constructor for `Ptr`s to substrings **

    template<class In> Str(In i, In j): data(new Vec<char>) {   
      std::copy(i, j, std::back_inserter(*data));
    }

private:
    // store a Ptr to a Vec
    Ptr< Vec<char> > data;
};

Split.h

Vec<Str> split(const Str& str) {
    typedef Str::const_iterator iter;
    Vec<Str> ret;

    iter i = str.begin();
    while (i != str.end()) {

        // ignore leading blanks
        i = find_if(i, str.end(), not_space);

        // find end of next word
        iter j = find_if(i, str.end(), space);

        // copy the characters in `[i,' `j)'
        if (i != str.end()) 
            ret.push_back(**substring**);        // Need to create substrings here
                                                 // call to str(i,j) gives error, detailed below
        i = j;
    }

    return ret;
}

私が最初に考えたのは、このコンストラクターを使用して、必要な部分文字列を作成 (ポインター) することでした。ここで呼び出すstr(i,j)とエラーメッセージが表示されます

type 'const Str' does not provide a call operator
  1. ここで簡単に呼び出すことはできないようstr(i,j)です。なぜだめですか?
  2. Strに似たメンバー関数を作成することで解決できsubstrますか?
4

0 に答える 0