クラスオブジェクトを間違ったタイプとして初期化する

Itamar Ivri

私はこのコードを持っていて、質問したいのですが、例外を取得せずに新しいint()でクラスオブジェクトを初期化するにはどうすればよいですか?オブジェクトの値を出力すると、ジャンクが出力されますが、この割り当てがどのように可能であるかがわかりません。new int(value)を使用すると、正確にはどうなりますか?int用のスペースを作成し、値で初期化しませんか?

class A {
    static A* first;
    static A* last;
    A *prev, *next;
public:
    A() : prev(last), next(nullptr) {
        cout << "A ctor" << endl;
        if (last) last->next = this;
        last = this;
        if (!first) first = this;
    }
    virtual ~A() {
        if (prev) prev->next = next;
        if (next) next->prev = prev;
        if (first == this) first = next;
        if (last == this) last = prev;
    }
    static void printAll() {
        if (first) cout << *first;
        else cout << "list is empty" << endl;
    }
    friend ostream& operator<<(ostream& out, const A&a) {
        a.printSelf();
        if (a.next) out << *(a.next);
        else out << endl;
        return out;
    }
    virtual void printSelf() const = 0;
};

template<class T>
class B : public A {
    T * t;
public:
    B(const T& _t) : t(new T(_t)) { cout << "B ctor" << endl; }
    virtual ~B() {
        cout << "Dtor B" << endl;
        cout << *this;
        delete t;
    }
    virtual void printSelf()const override {
        cout << *t << ' ';
    }
};
A* A::first = nullptr;
A * A::last = nullptr;

int main() {

    B<int*>b1 = new int(5);
    b1.printSelf(); //prints junk (b1.t value)
    cout << endl;
    cout << typeid(b1).name() << endl; //prints class B<int*>
}
エイドリアン市長

あなたはおそらくexplicitキーワードを探しています

明示的でない場合、コンパイラーはコンストラクターを使用して型間の暗黙的な変換を試みます。

class Test
{
public:
Test(int){}
};

Test t = 42;

これが発生するはずがない場合は、を使用できますexplicit(個人的には、コピー以外の単一引数のコンストラクターごとにデフォルトで使用することをお勧めします。

class Test
{
public:
explicit Test(int){}
};

Test t = 42; //error here

あなたの場合、Tはへのポインタintであるため、new int(5)ヒープ上に整数を生成し、それへのポインタを返します。これはの有効な引数ですB

コンストラクターの内部を見る:

B(const T& _t) : t(new T(_t)) { cout << "B ctor" << endl; }

_tintへのポインタであるaを受け取り(例:0xabcd-> 5)、。this->tで初期化されたintへのポインタへの新しいポインタで初期化し0xabcdます。あれは:

B(const int*& _t): t(new int*(_t))...
// t is &(0xabcd), *t is 0xabcd, **t is 5

次に印刷*t

cout << 0xabcd << ' '; // printing the memory address, not the value 5.

代わりにこれを試すことができます:

cout << **t << ' '; // Print 5

しかし...二重割り当てを解決し、メモリリークを取り除く方がおそらく良いでしょう:

B<int>b1 = 5;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

子のタイプを使用して親クラスのオブジェクトを初期化する

分類Dev

Unity-テキストオブジェクトが間違った位置でインスタンス化する

分類Dev

コンストラクター内でオブジェクトを値として受け取るマップを初期化しようとしています

分類Dev

(コピーコンストラクター)別のオブジェクトを初期化するためのパラメーターとして渡されたオブジェクトは、どのようにしてプライベートメンバーにアクセスできますか?

分類Dev

コンストラクターが非const参照をパラメーターとして食べるプライベートオブジェクトメンバーでオブジェクトを初期化する方法

分類Dev

クラスオブジェクトをタイプとして使用する

分類Dev

中括弧を使用したこの間違ったオブジェクトの初期化がコンパイルされるのはなぜですか?

分類Dev

'(Class)Object'タイプの初期化を使用してオブジェクトを作成および初期化する

分類Dev

コンストラクターの初期化リストで新しいオブジェクトを初期化して参照することは可能ですか?

分類Dev

Dart-オブジェクトのリストをプライベートクラスメンバーとして初期化する方法は?

分類Dev

コンストラクタなしで別のオブジェクト初期化内でオブジェクトを初期化することは可能ですか?

分類Dev

オブジェクトからのサブクラス化は、タイプをメタクラスとして定義することと同じですか?

分類Dev

Kotlinはオブジェクトクラスをパラメーターとして初期化します

分類Dev

タイプスクリプトでネストされたオブジェクトを初期化するための「デフォルトオブジェクト」?

分類Dev

オブジェクト指向プログラムを作成して、オブジェクトとインターフェースをスーパークラス、サブクラス、インターフェースでインスタンス化する方法

分類Dev

オブジェクト指向プログラムを作成して、オブジェクトとインターフェースをスーパークラス、サブクラス、インターフェースでインスタンス化する方法

分類Dev

間違ったプロジェクトからbuild.gradleを参照しているAndroidスタジオ

分類Dev

オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

分類Dev

Javaのコンストラクターを介してオブジェクトを初期化できません:誤ったコンパイル

分類Dev

未定義の参照:異なるクラスのオブジェクトのポインター配列を初期化しようとしています

分類Dev

memmoveを使用してC ++のコンストラクターでオブジェクト全体を初期化する

分類Dev

ネットワーク呼び出しJavaを必要とするオブジェクトを初期化するためのベストプラクティス

分類Dev

オブジェクトを変更しようとしたときに、オブジェクトをオーバーライドしてプロパティをインスタンス化する方法はありますか?

分類Dev

プロジェクトオイラー問題#18Python-間違った結果を得る。どうして?

分類Dev

間違ったテキストファイルから以前のオブジェクト属性を取得するPythonオブジェクトと、正しいテキストファイルから独自の属性を取得するPythonオブジェクト

分類Dev

Pythonで初期化せずにクラスオブジェクトの属性のタイプを取得する方法

分類Dev

JAVA:オブジェクトでラップされたインスタンスを使用してArrayListを特定のクラスタイプに初期化するにはどうすればよいですか?

分類Dev

パッケージプライベートコンストラクターを持つクラスと、Guiceを介してインスタンス化された対応するオブジェクトのプラスの副作用?

分類Dev

スーパークラスを使用してサブクラスオブジェクトJavaを初期化する

Related 関連記事

  1. 1

    子のタイプを使用して親クラスのオブジェクトを初期化する

  2. 2

    Unity-テキストオブジェクトが間違った位置でインスタンス化する

  3. 3

    コンストラクター内でオブジェクトを値として受け取るマップを初期化しようとしています

  4. 4

    (コピーコンストラクター)別のオブジェクトを初期化するためのパラメーターとして渡されたオブジェクトは、どのようにしてプライベートメンバーにアクセスできますか?

  5. 5

    コンストラクターが非const参照をパラメーターとして食べるプライベートオブジェクトメンバーでオブジェクトを初期化する方法

  6. 6

    クラスオブジェクトをタイプとして使用する

  7. 7

    中括弧を使用したこの間違ったオブジェクトの初期化がコンパイルされるのはなぜですか?

  8. 8

    '(Class)Object'タイプの初期化を使用してオブジェクトを作成および初期化する

  9. 9

    コンストラクターの初期化リストで新しいオブジェクトを初期化して参照することは可能ですか?

  10. 10

    Dart-オブジェクトのリストをプライベートクラスメンバーとして初期化する方法は?

  11. 11

    コンストラクタなしで別のオブジェクト初期化内でオブジェクトを初期化することは可能ですか?

  12. 12

    オブジェクトからのサブクラス化は、タイプをメタクラスとして定義することと同じですか?

  13. 13

    Kotlinはオブジェクトクラスをパラメーターとして初期化します

  14. 14

    タイプスクリプトでネストされたオブジェクトを初期化するための「デフォルトオブジェクト」?

  15. 15

    オブジェクト指向プログラムを作成して、オブジェクトとインターフェースをスーパークラス、サブクラス、インターフェースでインスタンス化する方法

  16. 16

    オブジェクト指向プログラムを作成して、オブジェクトとインターフェースをスーパークラス、サブクラス、インターフェースでインスタンス化する方法

  17. 17

    間違ったプロジェクトからbuild.gradleを参照しているAndroidスタジオ

  18. 18

    オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

  19. 19

    Javaのコンストラクターを介してオブジェクトを初期化できません:誤ったコンパイル

  20. 20

    未定義の参照:異なるクラスのオブジェクトのポインター配列を初期化しようとしています

  21. 21

    memmoveを使用してC ++のコンストラクターでオブジェクト全体を初期化する

  22. 22

    ネットワーク呼び出しJavaを必要とするオブジェクトを初期化するためのベストプラクティス

  23. 23

    オブジェクトを変更しようとしたときに、オブジェクトをオーバーライドしてプロパティをインスタンス化する方法はありますか?

  24. 24

    プロジェクトオイラー問題#18Python-間違った結果を得る。どうして?

  25. 25

    間違ったテキストファイルから以前のオブジェクト属性を取得するPythonオブジェクトと、正しいテキストファイルから独自の属性を取得するPythonオブジェクト

  26. 26

    Pythonで初期化せずにクラスオブジェクトの属性のタイプを取得する方法

  27. 27

    JAVA:オブジェクトでラップされたインスタンスを使用してArrayListを特定のクラスタイプに初期化するにはどうすればよいですか?

  28. 28

    パッケージプライベートコンストラクターを持つクラスと、Guiceを介してインスタンス化された対応するオブジェクトのプラスの副作用?

  29. 29

    スーパークラスを使用してサブクラスオブジェクトJavaを初期化する

ホットタグ

アーカイブ