2017-08-03 16 views
-1

Iは、データコンテナクラスから派生したクラスを有します。コンストラクタはコンテナのすべての内容を初期化できません。したがって、初期化を終了するために別のクラスメンバ関数を呼び出す必要があります(追加のデータを提供する)。このメンバー関数はブール値をtrueに設定し、データのアクセス準備が整ったことを示します。条件付きアクセス++

データは、クラスのメンバーだった場合、私は設定したい、それプライベート/保護されたと私は、次のようなアクセサを持っていると思います。私は、このクラスはから継承されないならばどのよう

mycontainer& get_data() { check_macro(ready, "Data not ready"); return data; } 

mycontainer?私はそれが私的にmycontainerから派生して、thisへの参照を返すことは、公開されることを期待することはできますか?

+0

コンストラクタをリファクタリングして、オブジェクトが完全に初期化されるまで終了しないようにすることはできますか? – NathanOliver

+0

まず何かが二あなたの最後の文はかなり無意味である、あなた以外のコンストラクタの初期化と魚です。何か助けが必要な場合は、あなたがしたよりも良い説明をしなければならないでしょう。 – snb

+0

@NathanOliver:これは行うことができ、私の本例であり、そして私はそれがより良いスタイルであることに同意。しかし、オブジェクトが宣言されたときにオブジェクトを完全に初期化することは論理的でない場合があると思います。格納されたデータの一部は、宣言時に未知の非constメンバーによって計算されてもよい。 – Joce

答えて

1

はあなたが別のクラスから継承したときに、あなたの新しいクラスが基底クラスが持つすべてのメンバーを持っていることに注意してください。クラスのメンバーとして直接アクセスするだけです。

以下の例では、派生クラスにメンバーはありませんが、 'DataContainerClass'から継承しているため、そのクラスのメンバーがすべて存在するため、 'Ints'メンバーがあります。彼らはあなたのクラスで定義されているかのよう

だから、あなたのデータコンテナの基本クラスが持っているものは何でもメンバー、あなただけにアクセスします。もちろん、メンバーはアクセス可能でなければなりません。

class DataContainerClass 
{ 
    public std::vector<int> Ints; 
} 



class MyClass : public DataContainerClass 
{ 
} 

int main() 
{ 
    MyClass cls; 

    // Ints is visible as a member of 'MyClass', because 
    // MyClass inherits from DataContainerClass. 
    cls.Ints.push_back(1); 
    cls.Ints.push_back(2); 

} 
+0

ありがとうございます。あなたの例では、 'MyClass'を' class MyClass:private DataContainerClass'に変更すると、 'main'で使うために' Ints'を返すアクセサを追加する必要があります。私のクラス 'class MyClass:private std :: vector 'があれば、基本クラス 'ベクトル'へのアクセサを定義できますか? – Joce

+0

その場合、アクセサーは必要ありません。 useは – ttemple

+0

です。継承をパブリックにする場合は、アクセサーは必要ありません。私的継承では、あなたはそうするでしょう。あなたがしようとしていることの良い議論についてはこれを見てください:https://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector – ttemple