3

簡単な質問ですが、構造体があります

struct Foo{
    float *bar;
    Foo(){
        bar = 0;
    }
};

およびロード機能:

bool loadFoo(Foo *data){
    float nums[4] = {0,1,2,3};
    data->bar = nums;
    return true;
};

そして、私は次のように実行します:

void main(){
    char data;
    Foo myFoo;
    loadFoo(&myFoo);
    std::cerr << sizeof(myFoo.bar) << "\n";
    std::cerr << myFoo.bar[0] << "\n";
    std::cerr << myFoo.bar[1] << "\n";
    std::cerr << myFoo.bar[2] << "\n";
    std::cerr << myFoo.bar[3];
    std::cin >> data;
};

sizeof(myFoo->bar) の出力は 4 バイトです。構造体をメソッドに渡すことで data->bar を変更できると考えました。bar は float *bar; であるため、ロード時に「不明なサイズ」であるため、バーが配列であることを指定できないため、配列にすることができます。(実装すると、プログラムはファイルから値を読み込みます) これはポインタ変数以外でも問題なく動作しますが、そのポインタは私には理解できないようです。

構造体を渡すときに変数ポインタを変更できるようにするにはどうすればよいですか?

どんな助けでも大歓迎です!

4

3 に答える 3

1

Instead of loadFoo you can have constructor

struct Foo{
    float *bar;
    Foo( int size){
        bar = new float[size];  //allocate memory
        //... Initialize bar
    }
    ~Foo() { delete bar;}
};

OR using initializer_list

#include <initializer_list>

struct Foo{
    float *bar;
    Foo( std::initializer_list<float> l){
        bar = new float[l.size()];  //allocate memory
        std::initializer_list<float> ::iterator it = l.begin();
        size_t i=0;
        for(;it!=l.end();++it,++i)
          bar[i] = *it;
    }
    ~Foo() { delete bar;}
};

Also, make sure you follow rule of three

于 2013-09-07T07:20:27.477 に答える