0

C++ で親イニシャライザを呼び出すためのこのコードがあります。

#include <iostream>

using namespace std;

class A
{
public:
    A(const string& a) {}
};

class B : public A
{
public:
    B(const string& b) : A(b) {}
};

このように親イニシャライザで少し装飾できると思います。

B(const string& b) : A(b + "!!") {}

では、親イニシャライザを設定するための決定ロジックが必要な場合はどうでしょうか? これを試しましたが、エラーメッセージが表示されました。

B(const string& b) {
    if (...) {
        A(b + "x");
    } else {
        A(b + "y");
    }
}

>> ERROR 

hier.cpp: In constructor 'B::B(const string&)':
hier.cpp:16:2: error: no matching function for call to 'A::A()'
4

5 に答える 5

2

実行したい複雑なロジックがある場合は、別の関数に入れることをお勧めします。

std::string modify(const std::string &b) {
    if (...) {
        return b + "x";
    } else {
        return b + "y";
    }
}

次に、その関数をイニシャライザ リストで使用できます。

B(const string& b) : A(modify(b)) {}
于 2013-06-14T16:14:02.677 に答える
1

次のように、基本クラスのコンストラクターに静的プライベート メソッドを配置できます。

class B : public A
{
public:
    B(const string& b) : A(initval(b)){}
private:
    static string initval(const string& b) {
        if (...)
            return b + "x";
        else
            return b + "y";
    }
};
于 2013-06-14T16:15:27.127 に答える
1

sth による回答に加えて、modify 関数を B の静的メソッドにすることもできます。

std::string B::modify(const std::string &b) {
    if (...) {
        return b + "x";
    } else {
        return b + "y";
    }
}

クラス定義:

static std::string B::modify(const std::string &b)

次に、それを使用します。

B(const string& b) : A(B::modify(b)) {}

これは、外部の別の関数としてではなく、B 内に完全にカプセル化されるためです。よりオブジェクト指向になります。

于 2013-06-14T16:33:57.470 に答える
0

同じコンストラクターを呼び出している限り (イニシャライザーに同じ署名を使用する)、Casey の回答を使用できます。ただし、次のようなことをしたい場合:

B(const string& b) {
    if (...) {
        A(b + "x");
    } else {
        A(foo, bar);
    }
}

その後、あなたは運命にあります。C++ にはそのようなものはありません。これを回避する唯一の方法は、デフォルトのコンストラクターを呼び出してから、特殊なメンバー関数 (通常は init() などと呼ばれます) を使用して初期化を行うことです。これは、残念ながら C++ では禁止されている、互いに呼び出して実装する必要があるさまざまなコンストラクターが多数ある場合に必要な手法と同じです。どちらの問題も、Objective-C のような美しい言語には存在しません。

于 2013-06-14T16:09:53.100 に答える