-1

假设我有一个分数类,并且我确实想将它们保留在向量中,我确实创建了一个分数向量

但是,我不知道如何读取向量内的值,通过读取我的意思是打印出值

结果f[0]会打印出分数的地址而不是分数的数据

void main()
{
    fraction fr(2,5);
    vector<fraction*> f;
    f.push_back(&fr);
    cout<<f[0]<<endl;
}
4

3 回答 3

0

您将指针fraction存储在向量中:vector<fraction*>.

cout << f[0]->numerator << "/" << f[0]->denominator << endl;
于 2013-08-09T05:15:28.500 回答
0

打印数据使用 cout<<*(f[0])<<endl;而不是 cout<<f[0]<<endl;

原因:由于您在 f 中仅存储分数类型的指针,因此 f[0] 为您提供了一个指针以获取一个值,只需使用 * 运算符取消引用它。

于 2013-08-09T05:22:48.260 回答
0

目前,您正在生成一个由分数类型的地址组成的向量

如果你真的想存储指针对象,获取存储在 f[0] 的值的最简单方法是 *f[0],因为 f[0] 是一个指针,指向你的分数类对象

编辑:(因为您的评论问题)我想向您解释您的程序:

void main()
{
    fraction fr(2,5);
    vector<fraction*> f; // define a vector-object storing fraction-class pointers
    f.push_back(&fr); // adding the address of fr
    cout<<f[0]<<endl; // printing out the address of fr which was previously stored
}

如果你多次重启这个程序,它可能会给你不同的输出。您将始终获得存储 fr 的地址,但是如果重新启动程序,该地址可能会有所不同(因为您的 PC 上的其他程序同时需要内存空间等)

如果您编写如下程序:

void main()
{
    fraction fr(2,5);
    vector<fraction*> f;
    f.push_back(&fr);
    for(int i=0;i<10;i++) cout<<f[0]<<endl;
}

该程序将为您提供 10 倍相同的输出,始终是 fr 的地址,并且始终相同,因为分配 fr 的内存空间对于整个程序流保持不变。(如果你重新执行它,它可能会给你 10 次不同的地址,但所有 10 次都是一样的)

如果您想获得 fr 的值,您至少有两种可能的选择:

void main()
{
    fraction fr(2,5);
    vector<fraction> f;  // no "*" so there is no pointer allocated
    f.push_back(fr); // no "&" so there is just the object fr stored, not its address
    cout<<f[0]<<endl;
}

第二种选择:

void main()
{
    fraction fr(2,5);
    vector<fraction*> f;  // pointer allocated
    f.push_back(&fr); // address of fr stored
    cout<<*f[0]<<endl; // the object at the address f[0] is printed out because of "*"
}

我还建议您使用向量的成员函数 f.at(),因为如果您尝试处理“数组/向量”范围之外的索引,它会返回错误。

我希望这能解决你的问题。如果没有,请在评论中再次询问;)

于 2013-08-09T05:24:01.627 回答