0

コードの重複を避けるために、この汎用構造を構築したいと考えています。scaledown24 構造体内の numbers24 ベクトルを、scaledown32 構造体内の numbers32 ベクトルとは異なるものにしたいと考えています。そのため、私が変更を加えると、それらは互いに影響を与えることができなくなります。しかし、プログラムを実行すると、printAddress 関数は 2 つのベクトルのアドレスが同じであることを示しています。どうすればこれを修正できますか。ありがとう。

#include <iostream>
#include <vector>

struct ScaleDown24{
    static std::vector<int> getVector() {
        std::vector<int> numbers24(3);
        return numbers24;
    };
    static inline void printAddress(std::vector<int>sumNumbers ) {
        std::vector<int> *p = &sumNumbers;
        std::cout << p << "\n";
    }
};

struct ScaleDown32{
    static std::vector<int> getVector() {
        std::vector<int> numbers32(4);
        return numbers32;
    };
    static inline void printAddress(std::vector<int>sumNumbers ) {
        std::vector<int> *p = &sumNumbers;
        std::cout << p << "\n";
    }
};

template<typename ScaleFunction>
void scaleDown(){
    std::vector<int>sumNumbers = ScaleFunction::getVector();
    ScaleFunction::printAddress(sumNumbers);

}

int main()
{
    scaleDown<ScaleDown24>();
    scaleDown<ScaleDown32>();
    return 0;
}
4

2 に答える 2

3

関数printAddress()は引数を値で受け取ります。これは、渡したもののコピーを作成していることを意味vectorアドレスを印刷しているのはそのコピーです。

あなたがする必要があるのは、コピーではなく元のアドレスを取得できるように、代わりにベクトル引数を参照で渡すことです。それは次のようになります。

static inline void printAddress(std::vector<int>& sumNumbers )
//                         this means reference ^       

また、次の問題も発生しscaleDown()ます。

template<typename ScaleFunction>
void scaleDown(){
    std::vector<int>sumNumbers = ScaleFunction::getVector();
    ScaleFunction::printAddress(sumNumbers);

}

は非静的ローカル変数であるためsumNumbers、その関数を呼び出すたびに同じアドレスを持つことができます。それぞれScaleFunctionに独自のベクトルが必要な場合は、次のように静的にすることができます。

template<typename ScaleFunction>
void scaleDown(){
    static std::vector<int>sumNumbers = ScaleFunction::getVector();
    ScaleFunction::printAddress(sumNumbers);

}

printAddress()また、 はベクトルを変更しないため、変更したくない場合は、ベクトルconstを作成して強制することができることに注意してください。それはあなたにこれを与えるでしょう:

static inline void printAddress(const std::vector<int>& sumNumbers ) {
    // no need for the pointer here
    std::cout << &sumNumbers << "\n";
}
于 2020-06-03T20:52:17.477 に答える