constオブジェクト

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
研修生

constオブジェクト

#1

投稿記事 by 研修生 » 16年前

4月から入社しC++言語の研修中です。
C++言語で色んなメンバ関数を実装するというのが出て、今とりあえずstringクラスのlength()関数を実装
しようとしています。
class String{
  char *str;
public:
  int Length() const;
  String();
 ~String();
};

String::String()
{
  str="ViaualC++";
}

String::~String()
{
 cout<<"デストラクタの呼び出し\n";
}

int String::Length() const
{
  const char *p=str;
  while(*str)
    str++;
  return(str-p);
}

int main()
{
  String strobj;
  //Length関数の処理
}
とここまで作ってみましたがMFCや既存のライブラリ関数は使ってはいけないとのことですので
上記のような形を取りましたが左辺値はconstオブジェクトに指定されていますとエラーが出ました。
調べてみた所、データ値が変更できないらしく悪戦苦闘してます。何かよい方法ありませんか?
※int String::Length()const の形式を使うこと前提です。

御津凪

Re:constオブジェクト

#2

投稿記事 by 御津凪 » 16年前

const オブジェクト、及び関数が const 扱いの時のメンバ変数は、通常、一切の変更をすることが出来ません。

今回の場合、String::Length() const 関数内で、メンバ変数である str をインクリメントによる変更をしようしています。

この処理であれば、 String::Length() const 関数内 の p と str の名前を入れ替えるだけで解決するはずです。

( p をインクリメントし、 p - str で長さを判定すれば、 str は一切変更しません。)

研修生

Re:constオブジェクト

#3

投稿記事 by 研修生 » 16年前

なるほどーありがとうございます。
int String::Length()const
{
   char *p=str;←
   while(*p)
     p++;
   retunr(p-str);
}

研修生

Re:constオブジェクト

#4

投稿記事 by 研修生 » 16年前

に修正しました。しかしコンパイルするとプログラムに問題が発生しましたと出ます。どうやらアドレスが渡っていないらしく中身を確認した所オブジェクト作成→コンストラクタで代入まではできているようですが ← の位置のstrの中身には何も入っていません。何故中身が入っていないのか教えていただけませんか?

研修生

Re:constオブジェクト

#5

投稿記事 by 研修生 » 16年前

自己解決しました。デストラクタで代入しないで関数内でやれば大ジョブでした。

閉鎖

“C言語何でも質問掲示板” へ戻る