对包含指针的结构传染媒介的尖指向传染媒介

时间:2018-03-20 02:51:28

标签: c++ pointers vector struct

private:
  struct info{
    int size = 0;
    int key = 0;
    int capacity = 1;
    std::vector<int*> *value = new std::vector<int*>(capacity);
  };

  int keyCapacity_;
  int size_;
  std::vector<info*> *keys_;

在一个函数中......

//some code
keys_ = new std::vector<info*>(keyCapacity_);
//some code
(*keys_)[size_] = new info;
(*keys_)[size_]->(*value)[size] = inputValue; //getting error on this line
(*keys_)[size_]->size += 1;
(*keys_)[size_]->key = key;

我有一个指向struct info向量的指针。然后在info中有一个指向将保存值的向量的指针。可以输入非常大量的数据,并且如果需要,程序调整矢量的大小。当前输入值被添加到向量上的第一个开放点,即size_。在我上面提到的那条线上,我收到了一个错误:

a3.hpp:67:20: error: expected unqualified-id before ‘(’ token
   (*keys_)[size_]->(*value)[size] = value;
                ^
a3.hpp:67:22: error: invalid type argument of unary ‘*’ (have ‘int’)
   (*keys_)[size_]->(*value)[size] = value;

如何访问此向量以更改值?

3 个答案:

答案 0 :(得分:2)

嗯,*value不在此范围内。它在括号中,因此将单独评估。要获得价值,您需要:

(*keys_)[size_]->value

然后你想要取消引用:

 *((*keys_)[size_]->value)

可能没有必要使用额外的套装,但事情很清楚。然后你想索引:

(*((*keys_)[size_]->value))[size]

我假设size_size是正确的,不同的索引。小心你的命名。这种相似性很容易让你失望。

作为旁注,请注意使用new几乎绝不是您在现代C ++中想要做的事情。你可能想要使用智能指针。

答案 1 :(得分:1)

(*keys_)[size_] 这个是对的

(*keys_)[size_]->(*value)[size] 但这个不是。它看起来像你正在调用(*值)[大小],这没有任何意义。这是一个语法错误。

因此您必须先调用该值,然后将其作为一个整体取消引用。像这样(*keys_)

int size = yourSize;
(*((*keys_)[size_]->value))

之后,您现在可以访问其中的索引和对象。

(*((*keys_)[size_]->value))[size] = &value;

答案 2 :(得分:0)

您的热线的快速解决方法是:(*((*keys_)[size_]->value))[size] = inputValue;

但严重的是,不要使用C风格的指针。请将您的代码更改为:

private:
    struct info {
        int size = 0;
        int key = 0;
        int capacity = 1;
        std::vector<int> value;
    }

    int keyCapacity_;
    int size_;
    std::vector<std::unique_ptr<info>> keys_;

在那个功能中:

//some code
keys_.resize(keyCapacity_);
//some code
keys_[size_] = std::make_unique<info>();
keys_[size_]->value[size] = inputValue;
keys_[size_]->size += 1;
keys_[size_]->key = key;

由于您还没有给出完整的示例,我无法完全确定,但代码对我来说仍然是错误的,因为您似乎尝试写入大小为0的向量。我可以看到这应该有用,但是把它当作一粒盐:

//some code
keys_.resize(keyCapacity_);
//some code
keys_[size_] = std::make_unique<info>();
keys_[size_]->value.push_back(inputValue);
keys_[size_]->size += 1;
keys_[size_]->key = key;