1

私はこれを試しました:

int n;
cin >> n;
int * pn = new int[n];

次に、このような配列を使用できます: pn[i] = ...

しかし、私は自分のクラスでそのようなものを整理したいと思います:

class MyString
{
    char* m_pStr;
    public:
    MyString(const char* pStr){ 
        this->CreateArray(pStr);
        strcpy(m_pStr, pStr);
    }
}

void main(){
    int N;
    cout << "Iinput N: ";
    cin >> N;
    MyString * ar = new MyString[N];

    char tmp[100];
    for (int i = 0; i < 4; i++){
        cout <<"Input the string for the Mystring " << i + 1 << " ";
        cin >> tmp;     
        ar[i] = MyString(tmp);
    }
}

エラー C2512: 'MyString' : 適切な既定のコンストラクターがありません。

4

3 に答える 3

0

さて、上記のコードで変更することがたくさんあります。

まず、あなたの質問に対する答えです。デフォルトのコンストラクターは必ずしも必要ではありません。実際、コンストラクターメソッドを定義しない場合、デフォルトのコンストラクターが自動的に呼び出されます。ただし、引数を使用してコンストラクターを定義したため、その動作を定義する必要があります。コードで呼び出されたくない場合はprivate、クラス定義で定義してください。これを修正すると、他の問題が発生します。

  1. thisは現在のオブジェクトへのポインタであり、それを逆参照して、CreateArray存在しないメンバー関数を取得しようとしています。

  2. C ++でコーディングするときは、Cスタイルの文字列を使用しないでください。オブジェクトを作成でき、Cスタイルの文字列が必要な場合は、というクラスstringのメソッドを使用して取得できます。stringc_str()

  3. voidmainを使用しないでください。すべてのコンパイラがそれを許可しているわけではありません

  4. を使用して、動的に作成されたアレイによって使用されているメモリを解放しますdelete [] ar

そのため、コードには多くの問題があります。ここでの本当の問題は、おそらくCを知っていて、C ++を急いで習得していることだと思いますが、言語を正しく習得するには忍耐が必要であり、コードが機能する可能性があるからといって、それが良いとは限らないことに注意してください。コードを記述し、言語を適切に学習したい場合は、もう少し努力する必要があります。私を信じてください、私は難しい方法を学びました!

于 2013-03-10T07:49:16.423 に答える
0

MyStringこの行で定義せずに、デフォルトのコンストラクターでクラスをインスタンス化しようとしています:

MyString * ar = new MyString[N];

オブジェクトを初期化する必要があるため、設定されていないデフォルトのコンストラクターを使用しようとします。

個人的にコンストラクターを次のように変更します。

MyString(const char* pStr);

に:

MyString(const char* pStr = "");

デフォルトのもののように振る舞うために。

于 2013-03-10T07:11:31.307 に答える
0

デフォルトのコンストラクターを含めるのを忘れていました!

MyString() : m_pStr(0) { }

ここから MyStrings の配列をインスタンス化しようとしたときに、そのエラーが発生しました。

MyString * ar = new MyString[N];

デフォルトのコンストラクターを探します。クラス定義で定義していないため、説明したエラーが発生しました。

したがって、問題を解決するには、クラスのデフォルトのコンストラクターを作成すると、すべてが正常にコンパイルされます。

詳細については、このリンクを参照してください (または、いくつかの C++ を読んでください)。

http://en.wikipedia.org/wiki/Default_constructor

于 2013-03-10T07:11:49.187 に答える