2009-09-21 11 views
1

のクローニング:私はBからFのクローンを作成するにはどうすればよいC++ - 私はそのような何か持っている基本クラス

Class Foo : Base {.."my stuph" ..}; 

int main() { 
    Base *b = new Base; 
    Foo f (b); <== **error** "invalid conversion from Base to Foo." 
    .. 
} 

を?
「私の習慣」には、FooとBaseの間でトレーニングを行う機能があります。
他の人が書いている間は、Baseを変更することはできません。ところで

Foo(const Base & b) 
: Base(b) // construct the base class, using its copy constructor 
{ 
    // plus, initialize Foo-specific member data here 
} 

おかげ

+0

あなたはどうしたらいいですか:Foo * f = new Foo ;? –

+2

ベースb =新しいベース;私に奇妙に見える – MadH

+0

修正:見える* Java *私に。 –

答えて

5

派生クラスを自動的に基底クラスから外すことはできません。しかし、その逆を行い、派生クラスから基底クラスを作成することができます。これはあなたを混乱させる可能性があります。あなたがやりたい

、あなたはFooに適切なコンストラクタを追加し、あなたが実際に完全に機能Fooインスタンスを構成するBaseインスタンスに不足している情報を作成する方法を考えなければなりません。

コンストラクタは次のようになります。

Foo(Base const& b) : Base(b) 
{ /* construct info specific to Foo (absent in Bar) */ } 
+0

ありがとう、それは本当に明確な説明です。 – name

4

は、型ベースの引数を取るコンストラクタを定義しますが、基本は民間ベースクラスになりたいあなたは確かにいますか?

+4

まあ、あなたがニットを選ぶなら、 "あなたは' class'キーワードが大文字であることを確信していますか? " msgstr "bがヒープ割り当てされることを確認しますか?" "新しいBの結果を' B'型の変数に割り当てることはできますか? "私はこれらすべてのことに対する答えは "いいえ"だと思う;-) –

+0

まあ、私はそのクラスのキーワードが大文字であることを逃した。とにかく、コンパイラはそれについて不平を言いますので、私はそれがタイプミスであったと確信しています。しかし、アクセス指定子を省略して基本クラスをプライベートにすることは、完全に合法ですが、意図していないと本当に混乱するので、私はそれを指摘したいと思います。 –

+1

@tkopec:問題の問題は、コードが何よりも多くのタイプミスを含んでいることです。あなたのアドバイスは良いですが、私はMariuszが望んでいることに多少は疑問を抱いています。結局のところ、クローニング操作ではありません。しかし、彼はとにかくクローニングの概念についてあいまいであるようです。 – sbi

1

基本クラスまたはその参照を受け取るコンストラクタを提供します。

1

がfooに基本パラメータを取るコンストラクタを与える:あなたは単一引数のコンストラクタを書くたび

class Foo : public Base { 
public: 
    explicit Foo(const Base &b) { 
     // do work to initialise Foo. You might want to include 
     Base::operator=(b); 
     // or you might not. Depends how Foo works, and what Base's 
     // constructors do. 
    } 
}; 

を、あなたは、「明示的な」を指定するかどうかを検討すべきです。

「明示的に」は、コンストラクタ呼び出しまたはキャストを明示的に記述した場合にのみコンストラクタを使用する必要があるということです。それはそこにない場合、コンパイラは、「暗黙のうちに」次のような状況では、たとえば、Fooのにベースオブジェクトを変換します:

int doSomething(const Foo &f) { 
    return 23; 
} 

Base b; 
doSomething(b); // doesn't compile 
doSomething(static_cast<Foo>(b)); // does compile 

あなたが「明示的な」を削除した場合、その後、doSomething(b)をコンパイルして、同じことをするだろう2行目として、bから一時的なFooオブジェクトを構築し、それをdoSomethingに渡します。

1

クローン操作は、オブジェクトの正確なコピーを提供するものです。 BaseからFooへの変換はクローン操作ではありません。あなたの質問に

classは、資本「C」で綴られる、Fooは基地から個人派生し、(この質問のための重要な)メンバーが示されていないことは、Base b = new Baseはコンパイルされないでしょうだ、と私は何を "見当がつかないFooBaseの間の運動は、意味すると考えられる。あなたが持っている問題だけを示す正しい例を作成し、あなたが見ているものと期待しているものの正確な記述を提供する時間をかけてください。それが問題なので、私はあなたが何を間違えたかをあなたに伝え始めるべきかわからない。コンパイルするコードを表示するために質問を変更することをお勧めします(問題を除いて)。

次に、この回答を編集して、何が起こっているのかを説明することができます。

関連する問題