【问题标题】:Using pointer vector to reference vector is illegal?使用指针向量指向参考向量是非法的?
【发布时间】:2019-09-25 05:25:29
【问题描述】:

我有一个问题。 用指针向量作为参考向量可以吗?

Struct Child
{
    int n;
    void func(int _n) 
    { 
        n = _n;
    };

}

struct Parent
{
    std::vector<Child> vec;    
}

void func(Parent* p)
{
    std::vector<Child>& ref = p->vec;  // is this ok?
    int value = 10;
    ref[0].func(value); // is this ok?
}

int main()
{
...
...
    Parent p;
    func(&p);
...
...


    return 0;
}

编译器gcc 4.4.7(c++11下)
我想,如果改变引用的值可以吗?

ref[0].func(value)

谢谢。

【问题讨论】:

  • 您是否尝试编译代码?如果是这样,编译器是否产生任何警告或错误消息?
  • 您将ref 定义为对Child 结构的向量 的引用。 ref 本身不是 Child 或对特定 Child 的引用。
  • 还要注意引用和指针是两个非常不同的东西。并且您没有将指针传递给::func
  • @R Sahu 这是示例代码。 ref-> 是错误的 ref.func 是正确的
  • @Someprogrammerdude 代码有错误。我想知道仅转换一个指向引用的指针是否有问题。

标签: c++ pointers reference c++98


【解决方案1】:
std::vector<Child>& ref = p->vec;  // is this ok? yes
int value = 10;
ref->func(value); // is this ok? no

ref 不是指针,因此您不能使用成员访问运算符 ->

ref 是一个向量,因此您需要选择要使用的 Child。

ref[ child_index ].func(value);

【讨论】:

  • std::vector& ref = p->vec; // 这个可以吗?是 如果是的话,这段代码可以吗?
  • 是的,那行没有问题。您正在创建对 vec 的引用。
【解决方案2】:

reference 只不过是对象的另一个名称。所以这些都是一样的:

std::vector<Child>& ref = p->vec;
std::vector<Child>& vecAlias = ref;
int value = 10;
ref[0].func(value);
vecAlias[0].func(value);
p->vec[0].func(value);

您不能更改引用的值。未初始化的引用不存在。一旦初始化,就无法更改它。 另一方面,指针具有相似的目的:它们允许从不同的地方访问相同的数据。您始终可以更改指针指向的内容。但是指针也更容易出错,因为 then 可以未初始化或空初始化。因此,如果您不需要这种灵活性,请尽量坚持参考。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2013-07-19
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多