1. ホーム
  2. c++

[解決済み] C++オブジェクトのメンバ変数をコンストラクタで初期化するにはどうすればよいですか?

2023-01-04 20:21:23

質問

メンバー変数としていくつかのオブジェクトを持つクラスがあります。これらのメンバのコンストラクタが宣言されたときに呼び出されないようにしたいので、明示的にオブジェクトへのポインタを保持しようとしています。私は何をやっているのか全く分かりません。

オブジェクトのメンバ変数を初期化するときにコンストラクタがすぐに呼び出される、次のようなことができるかもしれないと思いました。

class MyClass {
    public:
        MyClass(int n);
    private:
        AnotherClass another(100); // Construct AnotherClass right away!
};

しかし、私は MyClass を呼び出すようにしたいのです。 AnotherClass コンストラクタを呼び出します。私のコードはこんな感じです。

ファイル BigMommaClass.h

#include "ThingOne.h"
#include "ThingTwo.h"

class BigMommaClass {

        public:
                BigMommaClass(int numba1, int numba2);

        private:
                ThingOne* ThingOne;
                ThingTwo* ThingTwo;
};

ファイル BigMommaClass.cpp

#include "BigMommaClass.h"

BigMommaClass::BigMommaClass(int numba1, int numba2) {
        this->ThingOne = ThingOne(100);
        this->ThingTwo = ThingTwo(numba1, numba2);
}

コンパイルしようとすると、こんなエラーが出ます。

g++ -Wall -c -Iclasses -o objects/BigMommaClass.o classes/BigMommaClass.cpp
In file included from classes/BigMommaClass.cpp:1:0:
classes/BigMommaClass.h:12:8: error: declaration of âThingTwo* BigMommaClass::ThingTwoâ
classes/ThingTwo.h:1:11: error: changes meaning of âThingTwoâ from âclass ThingTwoâ
classes/BigMommaClass.cpp: In constructor âBigMommaClass::BigMommaClass(int, int)â:
classes/BigMommaClass.cpp:4:30: error: cannot convert âThingOneâ to âThingOne*â in assignment
classes/BigMommaClass.cpp:5:37: error: â((BigMommaClass*)this)->BigMommaClass::ThingTwoâ cannot be used as a function
make: *** [BigMommaClass.o] Error 1

私は正しいアプローチを使っていますが、間違った構文を使っているのでしょうか?あるいは、別の方向からこれを行うべきでしょうか?

どのように解決するのですか?

メンバ初期化リストで、メンバの初期化方法を指定することができます。

BigMommaClass {
    BigMommaClass(int, int);

private:
    ThingOne thingOne;
    ThingTwo thingTwo;
};

BigMommaClass::BigMommaClass(int numba1, int numba2)
    : thingOne(numba1 + numba2), thingTwo(numba1, numba2) {}