概要ファイルをロードするための複数の方法:コンストラクタC++の設計パターン:
を経由して別のファイルをロードするための標準C++の設計パターンの検索では、私はすべての派生クラスで使用されるいくつかの機能を持つBase
クラスを持っています(例えば、Derived_A
,Derived_B
)。主な相違点は、関数をオーバーライドするとDerived_B
がコンストラクタによってデータファイルをロードするために使用されることです(load
もコンストラクタの外で明示的に呼び出すことができます)。
私はこのことから、予期せぬ問題に遭遇した:コンストラクタによって呼び出さload
機能はBase
型としてクラスを扱いますが、私は、デフォルトのコンストラクタを使用して明示的にload
関数を呼び出すとき、仮想関数テーブルは、意図を許可load
関数が呼び出されます。
これは古典的な問題のようなにおいがしますが、私はそれを行う方法を理解できません(弱い型定義のために、私は最近Pythonでプログラミングしていました。
同じように、Base::load
は純粋な仮想/抽象であることが本当に欲しいです(派生クラスのみがインスタンス化されます)。しかし、それはコンパイルされません(コンパイラは純粋な仮想関数が呼び出されると見ているので、私は信じています)。
お手伝いできますか?
出力:
ロード/コンストラクタワット:
ベース::負荷file_Bロード/ファンクション・ポスト建設ワット
ベース::負荷file_A:
Derived_A ::負荷file_A
Derived_B ::ロードファイル_B
コード:
#include <iostream>
#include <string>
class Base
{
public:
Base() {}
Base(std::string x)
{
load(x);
}
virtual void load(std::string x)
{
std::cout << "\tBase::load " << x << std::endl;
}
};
class Derived_A : public Base
{
public:
Derived_A() {}
Derived_A(std::string x): Base(x) {}
void virtual load(std::string x)
{
std::cout << "\tDerived_A::load " << x << std::endl;
}
};
class Derived_B : public Base
{
public:
Derived_B() {}
Derived_B(std::string x): Base(x) {}
void virtual load(std::string x)
{
std::cout << "\tDerived_B::load " << x << std::endl;
}
};
int main()
{
// simpler code, but it doesn't behave as I hoped
std::cout << "Loading w/ constructor:" << std::endl;
Base*der_a = new Derived_A(std::string("file_A"));
Base*der_b = new Derived_B(std::string("file_B"));
// this is what I want to do
std::cout << "Loading w/ function post construction:" << std::endl;
der_a = new Derived_A;
der_a->load(std::string("file_A"));
der_b = new Derived_B;
der_b->load(std::string("file_B"));
return 0;
}
私は 'loader'パターンを使ってしまいました。どうもありがとう! – user