C++ 尝试访问类向量中的函数,而不更改向量的私有状态

C++ 尝试访问类向量中的函数,而不更改向量的私有状态,c++,stdvector,C++,Stdvector,我正试图找到一种方法,使下面的代码能够工作,而不必将BetasalHavector的访问权限从私有更改为公共。也许是一个函数,它返回一个指向所选元素的指针,然后就可以工作了?我不知道。受阻和沮丧。请帮忙 #include <algorithm> #include <condition_variable> #include <vector> using namespace std; class Alpha { private: int anInt;

我正试图找到一种方法,使下面的代码能够工作,而不必将BetasalHavector的访问权限从私有更改为公共。也许是一个函数,它返回一个指向所选元素的指针,然后就可以工作了?我不知道。受阻和沮丧。请帮忙

#include <algorithm>
#include <condition_variable>
#include <vector>

using namespace std;

class Alpha {

private:
    int anInt;

public:

    Alpha(int arg) { anInt = arg; }

    Alpha(const Alpha& orig) { }

    virtual ~Alpha() { }

    void Printf() { printf("%s: anInt = %d\n", __func__, anInt); }

};

class Beta {

private:    // Can not change protection (private) status of betasAlphaVector
        std::vector<std::unique_ptr<Alpha>> betasAlphaVector;
public:
    int maxAlphas;

public:

    Beta(int arg) { maxAlphas = arg; }

    Beta(const Beta& orig) { }

    virtual ~Beta() { }

    void AddAlpha(int arg) { betasAlphaVector.emplace_back(new Alpha(arg)); }

    int SizeAlpha() { return (int) betasAlphaVector.size(); }

};

#define MaximumAlphas 3

int main(int argc, char** argv) {

    Beta *beta = new Beta(MaximumAlphas);

    for (int i = 0; i < beta->maxAlphas; i++)
        beta->AddAlpha(i*10);

    printf("%s: Alpha vector size = %d\n", __func__, beta->SizeAlpha());

    beta->betasAlphaVector.at(1)->Printf();

    return 0;
}

你几乎给出了答案:

可能是一个函数,返回指向所选元素的指针 元素,然后就可以工作了

将该代码转换为您为简洁起见省略的其他代码:

class Beta {
public:
    Alpha* GetAlpha( int index ) { return betasAlphaVector.at( index  ).get(); }
    const Alpha* GetAlpha( int index ) const { return betasAlphaVector.at( index ).get(); }
};
第二个重载使您能够调用GetAlpha方法,即使Beta对象被声明为const

大体上:


一个建议是:让Beta::SizeAlpha返回size\u t类型的值,因为这是std::vector::size的返回类型。这通常是一个无符号整数,因为大小不能小于零。它还可以更好地移植到64位程序,因为size\u t通常会映射到一个64位无符号整数,而int在大多数平台上保持32位;我把这个问题发给了一个工作组。正如您所建议的,我将size_t作为返回数据类型,他们都抱怨。所以,我是这样贴的。我同意你的看法。永远不要听你朋友的话。我想知道他们是怎么争论的?我猜是个人喜好和争论的需要。在可能的情况下,我通常会尝试使用ssize_t和size_t,原因与您指定的完全相同。谢谢,谢谢你没有叫我白痴。
beta->GetAlpha( 1 )->Printf();