2017-05-09 23 views
0

私の値のすべての型に対して乗算のためのオーバーロード演算子を作成する必要がありますクラス。しかし、私はどのように文字列にSを整数で乗算するかをコード化することになっているのかどうかはわかりませんが、Nは文字列SをN回連結したものです。これは私が持っているものです:整数Nに文字列Sを掛け合わせるとSがN回連結されます。

enum Type { 
INTEGERVAL, 
FLOATVAL, 
STRINGVAL, 
UNKNOWNVAL, 
}; 

class Value { 
int i; 
float f; 
string s; 
Type t; 
public: 
Value(int i) : i(i), f(0), t(INTEGERVAL) {} 
Value(float f) : i(0), f(f), t(FLOATVAL) {} 
Value(string s) : i(0), f(0), s(s), t(STRINGVAL) {} 

Type GetType() { return t; } 
int GetIntValue(); 
float GetFloatValue(); 
string GetStringValue(); 


Value operator*(const Value& op) const 
{ 
    if (t == INTEGERVAL) 
    { 
     // I can multiply with another integer or float 
     if (op.t == INTEGERVAL) 
      return Value(i * op.i); 
     else if (op.t == FLOATVAL) 
      return Value(i * op.f); 
    } 
    else if (t == FLOATVAL) 
    { 
     // I can multiply with another integer or float 
     if (op.t == INTEGERVAL) 
      return Value(f * op.i); 
     else if (op.t == FLOATVAL) 
      return Value(f * op.f); 
    } 
    else if (t == STRINGVAL) 
    { 
     if (op.t == INTEGERVAL) 
     { 
      //I can concatenate a string times the value of the integer 

      //Not sure how to do it// 
      return Value(); //I don't know what the return should be// 
     } 
    } 
    return Value(); // invalid! 
} 
}; 

私は本当にこれが行われるはずですいくつかのガイダンスをいただきありがとうございます。 このコードに関するその他の情報を提供する必要がある場合や、より良い方法で質問する必要がある場合はお知らせください)

ありがとうございました!

+0

誰も文字列があなたの[値]クラスに格納されている方法を知っていない連結すると仮定すると、
一時的な文字列とforループを使用することができます。あなたは 'std :: string'メンバーを持っていますか? 'char *'?他の形式の文字列ですか? –

+1

しかし、一般的には、文字列オペランドの長さを見つけ、それを整数で掛けて結果の長さを求めます。スペースを割り当て/事前予約し、その文字列を何度も出力文字列にコピーします。 –

+0

@BenVoigtありがとうございました。私は本当に応答を感謝します。この質問に適切なValueクラスの部分を含めました。 Valueクラスが含まれているので、あなたの言ったことはまだ効くでしょうか? – Phoenix8

答えて

1

あなたはiに格納された整数値を持っていて、op.s

else if (t == STRINGVAL) 
    { 
     if (op.t == INTEGERVAL) 
     { 
      string temp; //Create a temporary string 
      //Optional but would be useful for reallocating 
      temp.reserve(op.s.length()*i); 
      for(int j=0;j<i;j++) //Assuming " i " has the count 
       temp += op.s;  //This will concatenate 

      return Value(temp); //Pass the newly created string 
     } 
    } 
+0

ありがとうございました@Sniperそれは完璧に働いたようです! – Phoenix8

+0

あなたは正確にどれだけ必要なのか分かっているので、事前にスペースを予約することをお勧めします。 –

+0

@BenVoigt私は同意しますが、http://www.cplusplus.com/reference/string/string/operator+=/に従います。文字列の場合は 'operator + =' **現在の値の末尾に追加の文字を追加して文字列を拡張します* * – Sniper

関連する問題