0

正しく初期化されていないメンバーに対して行うクラスのコンストラクターに苦労しています。

シミュレーションに使用する設定を処理するクラス「Settings」と、シミュレーション手順を実行するクラスSimulationsがあります。

私が理解できないのは、このコードが期待どおりに機能しない理由です。

      class Settings{ 
         public: 
           int n ; // a number I need to create properly a vector in my class simulation
           // ... rest of the code constructors etc to read values from files.
           // everything works fine and the values are assigned properly
       }

       class Simulation{
          public:
          std::vector<int> v ;
          Settings *SP;

          Simulation(Settings *);
        }

        Simulation::Simulation(Settings *pS) 
           :SP(pS), v(std::vector<int>(SP->n,0)) {}    // the constructor doesn't work,
    // v is initialized but it is not created as a vector of size n, but 0.

コンストラクターの使い方に問題があると思いますが、その理由がわかりません。

ちなみに、中括弧内でvを定義するとうまく機能しますが、適切な方法で定義しても期待どおりに機能しない理由を知りたいだけです。

助けてくれてありがとう!

4

4 に答える 4

2

pS->n != 0インスタンス化する前に、それを確認しましたSimulationよね?

とにかく、コンストラクターで探している行は次のとおりです。

:SP(pS), v(pS->n, 0) {}

現在の方法は、全体を作成してからstd::vectorコピーすることvです。

于 2012-08-06T02:57:45.263 に答える
2

余分なベクトルは必要ありません:

Simulation::Simulation(Settings *pS) 
       :SP(pS), v(SP->n,0) {}

これが機能しない場合、これはあなたのコードではありません。クラス定義でSP前に宣言されていますか?vこれも機能しない場合は、pSの代わりにを試してくださいSP

于 2012-08-06T02:57:57.317 に答える
0

余分なベクトルを作成してコピーコンストラクターを使用する必要はありません。メンバー初期化子のベクトルに引数を直接渡すだけです。別のポスターが述べたように、SP-> nの戻り値が実際には0ではないことを確認しましたか?にいくつかの値をハードコーディングすると、次のように正常に機能することがわかります。

#include <iostream>
#include <vector>
using namespace std;

class foo
{
public:
    foo();
    vector<int> vec;
};

int main()
{
    foo obj;
    for(int i=0;i<obj.vec.size();++i) {
        cout << obj.vec[i] << ' ';
    }
    system("pause");
    return 0;
}


foo::foo()
    :vec(vector<int>(10,2))
{

}
于 2012-08-06T03:10:47.687 に答える
0

また、SPがnullポインタでないことを確認してください。そうしないと、クラッシュします。

Simulation::Simulation(Settings *pS) 
   :SP(pS), v(pS != NULL ? pS->n : 0 , 0) {}

これにより、SPがNULLでないかどうかがチェックされます。これは、Simulation(NULL)がコンストラクターとして使用される場合です。

于 2012-08-06T03:07:24.547 に答える