2017-03-24 5 views
0

私はC++に非常に新しいです。私は次のような状況があります:私は2つの仮想関数(純粋ではない)を保持する基本クラスを持っています。私はこれらの仮想関数を実装したこのクラスの派生クラスを持っています。今私のmain()関数では、基本クラスへのポインタオブジェクトへのポインタを作成しました。このオブジェクトを使用すると、派生クラスのオブジェクトと関数にアクセスする方法を知ることができます。C++の基本クラス "ポインタへのポインタ"オブジェクトへの派生クラスオブジェクトの割り当てとアクセス

私は派生クラスオブジェクトにアクセスするために使用する必要がある基本クラスのポインタオブジェクトへのポインタが必要です。

基底クラス:

class another 
{ 
    public: 
    virtual void setName(){}; 
    virtual string getName(){}; 
}; 

派生クラス

class use: public another 
{ 
    public: 
     string str; 
    void setName() 
     { 
      str = "USE CLASS"; 
     } 
     string getName() 
     { 
      return str; 
     } 
}; 

MY main()関数:

int main() 
{ 
    another **an; 
    *an = new use(); 
    an->setName(); //getting error 
    cout<<an->getName()<<endl; //getting error 
    return 0; 

} 

答えて

2
*an = new use(); 

ポインタanが初期化されていない、それが逆参照することはできません。二重ポインタ(ポインタへのポインタ)を使用することはここでは実用的ではありません。このケースでは、すべてのtitは、コードへの別のレベルの参照を追加することです。そのようなポインタを逆参照する式は、クラス 'another'へのポインタの値をもたらし、格納されます...どこですか?あなたはそのストレージを作成していないので、そのような操作はUBです。コードの

法的変種:

int main() 
{ 
    another **an = new another*(); // creating storage for pointer 
    *an = new use(); 
    (*an)->setName(); 
    cout<<(*an)->getName()<<endl; 
    delete *an; // don't rely on OS to do so. 
    delete an; 
    return 0; 
} 


int main() 
{ 
    another **an = new another*(new use()); // doing this in one line 
    // storage of *an would be value-initialized by value returned 
    // from 'new use()' instead of default initialization 
    (*an)->setName(); 
    cout<<(*an)->getName()<<endl; 
    delete *an; // don't rely on OS to do so. 
    delete an; 
    return 0; 
} 

int main() 
{ 
    another *an = new use(); 
    // We don't need another pointer~ use an reference where required? 

    an->setName(); 
    cout<<an->getName()<<endl; 
    delete an; // don't rely on OS to do so. 
    return 0; 
} 

PS。このクラスの宣言は、技術的には不正です。私はあなたがgetNameの本体をスキップしたと推測します。関数の欠損した戻り値についてのコンパイル時エラーが発生するはずです。 anotherが使用不能にクラス自体がある場合は、純粋な

class another 
{ 
    public: 
    virtual void setName() = 0; 
    virtual string getName() = 0; 
}; 
ようなクラスのまたはそれらのメソッドをオーバーライドしない派生クラスのインスタンスを作成することができません

が、それはその「定型」仕組みを提供しています」とメソッドを宣言してもよいです再勉強する。

+0

優れています。ありがとう –

0

ananotherへのポインタへのポインタです。 *ananotherへのポインタを返します。だから、あなたはそうのような(*an)->setName();をしたい:

int main() 
{ 
    another **an; 
    *an = new use(); 
    (*an)->setName(); //getting error 
    cout<<(*an)->getName()<<endl; //getting error 
    return 0; 
} 
+0

thanks mate。しかし、あなたが上記で提供した同じmain()関数を使うと、初期化されていない変数 'an'のようなエラーが出ます。それを初期化する方法を教えていただけますか? –

関連する問題