2017-10-10 6 views
3

C++では、クラスのデフォルト値を変更して、そのクラスで作成されたすべてのオブジェクトに値が指定されるようにすることは可能ですか?C++クラスのデフォルト値を実行時に変更できますか?

実行時に同じ親クラスの他の子とほぼ同じになるはずのユーザー定義のクラスを作成しようとしていますが、同じフォーマットのコンストラクターを両方に持つ方法には苦労しています。正しい情報をすべての新しいオブジェクトに適切に振り向けるために考えることができる唯一の方法は、作成時に常にクラスの型を別々に扱うか(常にユーザー入力をコンストラクタに入れます)、作成時のクラスのオブジェクト動作を定義された入力にデフォルト設定されます。

編集:より良い問題を説明し、ここでXYの問題の可能性に対処するためにはシナリオです:

一般的なプログラム: 私は、ユーザーが最初に名前と番号を提供することにより、カスタムシェイプを定義したいですそれを定義する行のユーザーは、三角形、四角形、カスタムシェイプを「カート」に追加できます。各カスタムシェイプは、最初に指定したシェイプと同じ形状ですが、ユーザーはプログラム中に変更しません。プログラムは、存在する特定のタイプのメンバ数やカート内の総ライン数などの一般的な情報を返すことができます。

親クラスがあります:

クラスshape

メンバーNUMLINES、名;

そして、3つのクラスがShapeの子である:

クラストライアングル

上書きNUMLINES = 3、名前= "トライアングル"。

...

クラスuserShape

上書きnumline = ????、名前= ????。

"シェイプ"オブジェクトとやりとりするカート用のメソッドを作成するときに、userShapeのコンストラクターを別の方法で扱う必要がなく、追加のオブジェクトを作成するためにボード全体で同じコードを使用できます。

私が受け取った答えから、静的型はデフォルト値のユーザー設定に最も適しているようですが、このようなものを実装するためのより良い方法があります。

+3

「実行時にユーザー定義のクラスを作成しようとしています」というのは、C++でですか?どうやって? – AndyG

+0

デフォルトを変更することはできませんが、あなたが言っていることは違っています...どのように使用するかのコード例を挙げることはできますか? – lorro

+0

静的メンバーを利用したいと思うようなサウンドです。 – Ron

答えて

6

あなたができるというだけで、あなたがするべきではありません。今、私は邪魔にならないよう、ここではどのようだというしまったこと:関数のデフォルト引数は定数式である必要はありません

#include <iostream> 

struct C { 
    static int default_val; 
    C(int i = default_val) { 
     std::cout << i << '\n'; 
    } 
}; 

int C::default_val = 0; 

int main() { 
    C c; 

    C::default_val = 1; 

    C c2; 

    return 0; 
} 

、それだけの機能があるすべての場所で、「利用可能」である必要がありますと呼ばれる。静的な変数はそれだけです。

また、コールサイトでアクセスする必要はありません。したがって、クラスでクラスを制御したいが、クラスの外部からは変更できないようにするには、クラスをプライベートにすることができます。

私は、次の次のパターンをお勧めします
0

静的メンバーを使用して、オブジェクト間で共有されるようにしてください。

+3

もう少し説明して例を書いてください。 –

2

:アプリケーションの実行

  • 読み取り/多くを作成するために、その構成
  • 使用工場から、そのオブジェクトのファクトリを作成した構成
  • をロードしますアプリケーションの存続期間中に同じオブジェクトのインスタンスが返される

例:

struct Object { 
    Object(int x, int y) : _x(x), _y(y) {} 

    int _x, _y; 
}; 

struct DynamicFactory { 
    DynamicFactory(int x, int y) : _x(x), _y(y) {} 

    std::shared_ptr<Object> generate() { return std::make_shared<Object>(_x, _y); } 

    int _x, _y; 
}; 

int main(){ 

    // Load configuration 

    // Initialize dynamic factory using configuration 
    DynamicFactory factory(1, 3); 

    // Generate objects 
    auto obj1 = factory.generate(); 
    auto obj2 = factory.generate(); 

    return 0; 
} 
関連する問題