2016-05-15 7 views
3

私はC++を初めて使用しています。私は最初のプログラムを実装するのに少し問題があります。私はchar(c-string)の配列だけでなく、長さと最大容量を含むLineクラスを作成する必要があります。 linePtrメンバ変数の型はchar*です。ここで私が持っているものです。C-文字列のテキスト行クラスを作成しようとしています

Line.h:

#pragma once 

#ifndef LINE_H 
#define LINE_H 

#include <iostream> 

using namespace std; 

class Line { 

private: 
    char* linePtr{nullptr}; 
    int lineLength; 
    int lineCapacity; 

public: 
    Line(); //default ctor 
    Line(char); 
    ~Line(); 

    friend ostream& operator<<(ostream& output, const Line& l); 

}; 

#endif // !LINE_H 

Line.cpp:

#include <iostream> 
#include <cstring> 
#include "Line.h" 

using std::cout; 
using std::endl; 
using std::strcpy; 
using std::strlen; 

const int LINE_CAPACITY = 5000; //arbitrarily set 

Line::Line() { 
    cout << "Default ctor" << endl; 

    linePtr = new char[1]{ '\0' }; 
    lineCapacity = LINE_CAPACITY; 
    lineLength = 0; 
} 

Line::Line(char cstr) { 
    cout << "ctor Line(char cstr)" << endl; 

    linePtr = new char[2]; 
    lineCapacity = LINE_CAPACITY; 
    lineLength = 1; 

    linePtr[0] = cstr; 
} 

ostream& operator<<(ostream& out, const Line& l) { 
    return out << l.linePtr; 
} 

MAIN.CPP:

#include <iostream> 
#include "Line.h" 

using namespace::std; 

int main() { 

    Line l1; 
    cout << l1 << endl; 

    Line l2('x'); 
    cout << l2 << endl; 

    system("pause"); 
    return 0; 
} 

私はデバッグを実行し、ときlinePtrフィールドが書き込まれます。「文字列の読み込みエラーです。」というメッセージが表示されます。私は何か愚かなことをしていると確信していますが、私はそれを理解することはできません。

+0

私たちに見せるには 'Line.h'をお持ちですか? –

+1

答えはすでに解決策を示しています。しかし、LineCapacityは割り当てられたバイト数を保持する必要があります。それ以外の場合は役に立たない。 – Christophe

+0

なぜ 'std :: string'を使わず、すべての頭痛から自分を救うのですか? 'char *'を使って、 'Line'オブジェクトをコピーしようとすると、あなたはまだ問題があることがわかります。 – PaulMcKenzie

答えて

4

2番目のコンストラクタで文字配列をNULL終了していません。メソッドの最後に次の行を追加してください:

linePtr[1] = '\0'; 
+0

返信ありがとう、それを試みましたが、私はまだ同じエラーが発生します。私のデフォルトのコンストラクタでさえ私に同じエラーを与えています。 lineLengthとlineCapacityの値がばかげていることを示すデバッガ(-858993460) – lebman

+2

@ KarlSamaha:-858993460は、16進数で0xCCCCCCCCです。 Visual StudioのCRT実装は、デバッグビルドでこの値を使用して、初期化されていないデータを示します。 c'torが完了するまで実行した後でも、これらの値が表示されますか? – IInspectable

+1

また、コンパイラがコードを最適化している場合は、デバッガの変数に奇妙な値が表示されることがあります。デバッグ時に/ Odを使用して最適化をオフにします。 – kcraigie

関連する問題