で返します、私は値することにより、これらのいずれかを返すファクトリ関数を作成したので、動的メモリ割り当てを排除したいC++クラスの設計と私はこのようになりますクラス階層を持っている価値
class Address {
public:
virtual ~Address() {}
enum Type {
Internal, External
};
Type type() const { return _type; }
protected:
Address(Type type) : _type(type) {}
private:
Type _type;
};
class InternalAddress : public Address {
public:
InternalAddress(const string& portName) : Address(Internal), _portName(portName) {}
~InternalAddress() {}
const string& portName() const { return _portName; }
private:
string _portName;
};
class ExternalAddress : public Address {
public:
ExternalAddress(const string& handlerName) : Address(External), _handlerName(handlerName) {}
~ExternalAddress() {}
const string& handlerName() const { return string("handler"); }
private:
string _handlerName;
};
に応じてパラメータ:
static Address addressForType(Address::Type type) {
if (Address::Internal == type)
return InternalAddress();
else
return ExternalAddress();
}
私は、このような何か:
int main(int argc, char **argv) {
Address address = addressForType(Address::External);
cout << ((ExternalAddress&)address).handlerName() << endl;
}
をanythがあります私がここでやっていることに間違っていますか?または、これはちょうど悪いデザインですか?私が尋ねる理由は、既存のシステムを変更しようとしているため、動的メモリ割り当てが少なくて済むからです。動的に割り当てられたオブジェクトではなく、値によって返されるコードを変更すると、 "handlerName()"メソッドによって返された文字列参照にアクセスしようとするとsegfaultが発生します。
これを行うより良い方法がある場合は、私に教えてください!私は、簡潔にするために、コピーコンストラクタと代入演算子を除外していることを付け加えます。これらのプレゼントがあっても、私は同じ結果を得ます。
ありがとうございました。
デザインが不良です。あなたのコードは[オブジェクトのスライス](http://stackoverflow.com/questions/274626/what-is-object-slicing)に苦しんでいます。 –
ありがとう!それはまさに私が探していたものです。再設計が進んでいます... – DaveR
私は、主な設計上の問題は動的多型を使用するときに動的メモリを避けようとしていると思います。動的ツールは常に動的なリソースを何らかの方法で必要とします。静的ポリモーフィズムを使用するか、動的リソースの使用を避けることをあきらめてください。 – KABoissonneault