[an error occurred while processing this directive]
[an error occurred while processing this directive]class A{ int n; public: A(void){ n = 123; /* コンストラクタの処理 */ } };と書く代わりに、
class A{ int n; public: A(void) : n(123) { /* コンストラクタの処理 */ } };と書くことが出来る。intのコンストラクタをA(void)が継承している、見れる。
/* in A.h */ class A{ int n; public: A(void); }; /* in A.cc */ A:A(void) : n(123) { /* コンストラクタの処理 */ }となる。
#include実行結果class A{ protected; public: A(void){ std::cout << "A!" << std::endl; } A(int n){ std::cout << "A : " << n << std::endl; } }; class B : A{ public: B(void) { cout << "B!" << endl; } }; int main(void){ B* b = new B(); }
A! B!でもこれはちょっと省略した書き方で、明示的にコンストラクタを指定するのが本流。
class B : A{
public:
B(void) : A() {
cout << "B!" << endl;
}
};
他のコンストラクタを呼ぶことも出来る。
class B : A{
public:
B(void) : A(1) {
cout << "B!" << endl;
}
};
実行結果
A : 1 B!
#include<iostream> class Hoge{//Hogeクラスの宣言 public: int foo; Hoge(int foo_){foo = foo_;} // コンストラクタ int print(void){std::cout << foo << '\n';} // print関数 }; class SuperHoge: public Hoge{// hogeを継承したSuperHogeクラスの宣言 public: SuperHoge(int foo_){foo = foo_ * foo_;}// コンストラクタ }; int main(){ SuperHoge sh(3); sh.print(); }コンパイルすると、下のようなエラー。
test.cc: In method `SuperHoge::SuperHoge(int)': test.cc:21: no matching function for call to `Hoge::Hoge ()' test.cc:7: candidates are: Hoge::Hoge(int) test.cc:15: Hoge::Hoge(const Hoge &)SuperHogeを作る時は、まずHogeのコンストラクタが呼ばれ、さらにSuperHogeが呼ばれるのだが、 この書き方だと、呼ばれるHogeのコンストラクタには、引数は与えられないらしい。 なので、Hogeクラスの方にHoge(void){}というコンストラクタを定義する必要がある。
class Hoge{//Hogeクラスの宣言
public:
int foo;
Hoge(void){}
Hoge(int foo_){foo = foo_;} // コンストラクタ
int print(void){std::cout << foo << '\n';} // print関数
};
(追記) あるいは、下のように書くと、ちゃんとどのコンストラクタを継承するか指定できる。
class SuperHoge: public Hoge{// hogeを継承したSuperHogeクラスの宣言
public:
SuperHoge(int foo_) : Hoge(foo_) {foo = foo_ * foo_;}// コンストラクタ
};