C++でカスタムCタイプの文字列クラスを作成する必要があります。私はこれを動作させるのに問題があります。現時点では、私のコードは実行時エラーで起動時にクラッシュします。関数の多くが間違っていることも知っていますが、他の関数を修正する前にメンバ関数をソートする必要があります。関数プロトタイプはすべて私たちに与えられたものであり、私はそれらを変更できないことを覚えておいてください。私は話すために '勇気'を書く必要があります。C++でカスタムCタイプの文字列クラスを作成する
私のコンストラクタが最初に間違っていますか?
#include <iostream>
#include "tstr.h"
using namespace std;
//Default constructor to initialize the string to null
TStr::TStr() {
strPtr = 0;
strSize = 0;
}
//constructor; conversion from the char string
TStr::TStr(const char *str) {
int i=0;
while (str[i] != '/0') {
strPtr = new char [strlen(str)+1];
for (i=0; i <strSize;++i) {
strPtr[i] = str[i];
}
++i;
}
strSize = i;
}
//Copy constructor
TStr::TStr(const TStr&) {
}
//Destructor
TStr::~TStr() {
if (strPtr) {
delete[] strPtr;
}
}
//subscript operators-checks for range
char& TStr::operator [] (int i) {
assert (i >= 0 && i < strSize);
return strPtr[i];
}
const char& TStr::operator [] (int i) const {
assert (i >= 0 && i < strSize);
return strPtr[i];
}
//overload the concatenation oprerator
TStr TStr::operator += (const TStr& str) {
//this->strPtr += str.strPtr;
//this->strSize += str.strSize;
return *this;
}
//overload the assignment operator
const TStr& TStr::operator = (const TStr& str) {
if (this != &str) {
delete[] strPtr;
strPtr = new char[strSize = str.strSize];
assert(strPtr);
for (int i=0; i<strSize; ++i) {
strPtr[i] = str.strPtr[i];
}
}
return *this;
}
//overload two relational operators as member functions
bool TStr::operator == (const TStr& str) const {
return (strPtr == str.strPtr && strSize == str.strSize);
}
bool TStr::operator < (const TStr& str) const {
return (strPtr < str.strPtr && strSize < str.strSize);
}
//the length of the string
int TStr::size() {
return strSize;
}
お返事ありがとうございました! :)
編集1:さて、コンストラクタは動作していますが、私はまだランタイムエラーが発生しています。私はオーバロードされた+ =演算子を使用することを90%確信しています。それはうまく見え、コンパイルが大丈夫です。私は何が欠けていますか?
(注:だけの小さな変更は上記のコードに行われているが、あなたは全体の多くを見たい場合は私に知らせて)
//overload the concatenation oprerator
TStr TStr::operator += (const TStr& str) {
for(int i = 0; i < strSize; ++i) {
strPtr[i] += str.strPtr[i];
}
return *this;
}
EDIT 2:わかりました、私が今持っているものこれ。コンパイルは正常ですが、実際には2つの文字列を+ =と一緒に追加する必要はありません。誰もがアイデアを持っていますか?
//overload the concatenation oprerator
TStr TStr::operator += (const TStr& str) {
char *buffer = new char[strSize + str.strSize + 1];
strcpy(buffer, strPtr);
strcat(buffer, str.strPtr);
delete [] strPtr;
strPtr = buffer;
return *this;
}
//overload the assignment operator
const TStr& TStr::operator = (const TStr& str) {
if (this != &str) {
delete[] strPtr;
strPtr = new char[strSize = str.strSize];
assert(strPtr);
for (int i=0; i<strSize; ++i) {
strPtr[i] = str.strPtr[i];
}
}
return *this;
}
これはタイプミスかどうかわかりませんが、NULLターミネータがエスケープ文字ではなくフォワードスラッシュを使用しているようです。 – Dawson
デストラクタで 'if(strPtr)'をチェックする必要はありません。 'delete []' 'NULL'ポインタはnopであり、クラッシュしません。 –
また、リリースビルドでは削除されているので、 'assert'を使用しないでください。例外を使用します。 –