8

定数関数やオブジェクトの使い方を学ぼうとしていますが、エラーが発生して1時間以上起きてしまい、理解できないようです。私は簡単な例に従っていましたが、途中で道に迷ったと思います。これが私のコードです。

Main.cpp

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

int main(){
    ExampleClass exampleObj; // object used to call members of ExampleClass.
    exampleObj.printText(); // calls printVar from the ExampleClass.

    const ExampleClass constantObject; // object used to call constant members of ExampleClass.
    constantObject.printConstText(); // calls printConstVar from the ExampleClass.

    return 0;
}

ExampleClass.h

#ifndef EXAMPLECLASS_H
#define EXAMPLECLASS_H


class ExampleClass
{
    public:
        void printText();
        void printConstText() const;
};

#endif // EXAMPLECLASS_H

ExampleClass.cpp

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

void ExampleClass::printText(){
    std::cout << "The code works!" << "\n";
}

void ExampleClass::printConstText() const{
    std::cout << "The code works!" << "\n";
}

そして、私はエラーを受け取っています:

C:\Documents and Settings\Me\My Documents\ConstObjects\main.cpp||In function 'int main()':|
C:\Documents and Settings\Me\My Documents\ConstObjects\main.cpp|8|error: uninitialized const 'constantObject'|
||=== Build finished: 1 errors, 0 warnings ===|

ExampleClassの前にconstを取り出すと、コードは正常に実行されます。しかし、それはまだ一定のオブジェクトですか?助けてくれてありがとう、私は十分な情報を与えたことを望みます。それがまったく重要な場合、私はコードブロックを使用しています。

4

3 に答える 3

6

constオブジェクト「constantObject」には初期化子が必要であるか、「classExampleClass」にユーザー宣言のデフォルトコンストラクターが必要です。

于 2012-08-15T06:57:45.900 に答える
5

あなたExampleClassPOD(プレーンオールドデータ)構造です。このようにローカル変数として宣言されている場合、ExampleClass exampleObjデフォルトのコンストラクターは呼び出されず、初期化されていません。

独自のデフォルト コンストラクタを作成するか、次の構文を使用する必要があります - ExampleClass exampleObj = ExampleClass();. これにより、一時ExampleClassオブジェクトが作成され、値が初期化されますexampoleObj

更新しました:

以下は、C++03 標準 8.5.9 からの抜粋です。

オブジェクトに初期化子が指定されておらず、オブジェクトが (おそらく cv 修飾された) 非 POD クラス型 (またはその配列) である場合、オブジェクトはデフォルトで初期化されます。

オブジェクトが const 修飾された型の場合、基になるクラス型には、ユーザーが宣言したデフォルトのコンストラクターが必要です。[これは const オブジェクトに適用されます]

それ以外の場合、非静的オブジェクトに対して初期化子が指定されていない場合、オブジェクトとそのサブオブジェクト (存在する場合) の初期値は不定です)。オブジェクトまたはそのサブオブジェクトのいずれかが const 修飾された型である場合、プログラムは不正な形式です。[これは const と POD 型に適用されます]

これは、constantObjectユーザー定義のデフォルト コンストラクターが必要であることを意味します。そうしないと、プログラムの形式が正しくないため、診断する必要があります。const を削除すると、オブジェクトはとにかく初期化されないままになります (初期値が不確定になります) 。

于 2012-08-15T07:01:28.647 に答える
1

この動作は問題と見なされており、少なくとも GCC の新しいバージョンでは、おそらく C++11 標準では修正されているようです。問題報告はこちらをご覧ください。

于 2012-08-15T07:35:43.663 に答える