【问题标题】:(C++)Syntax for instantiating and assigning new objects to 2D vector of pointers to same object type?(C++)实例化新对象并将其分配给指向相同对象类型的指针的二维向量的语法?
【发布时间】:2017-01-21 02:49:41
【问题描述】:

如果这个问题已经被问到,我最诚挚的道歉,但我看到的其他答案让我感到困惑。我有一个类,我想用它来构建另一种对象的二维矩阵。我正在尝试编写一种方法来创建新对象,并将二维向量中的指针分配给新对象,但我似乎无法正确使用语法。

我像这样创建一个二维向量:

std::vector<std::vector<CSinusoid*>> *m_SineMatrix; //2D Vector of pointers to CSinusoid objects

然后我尝试按照这些思路创建一个方法:

void CWaveMatrix::Init_SineMatrix(int x, int y)
{
    m_SineMatrix[x][y] = new CSinusoid(); 
}

函数内的代码行是我遇到问题的地方。我不知道如何告诉二维向量中的特定指针指向新对象。

请注意,向量和方法都是同一类的私有成员。

【问题讨论】:

    标签: c++ class pointers vector 2d


    【解决方案1】:

    我认为你的问题实际上是在这里:

    std::vector<std::vector<CSinusoid*>> *m_SineMatrix
    

    m_SineMatrix 不是 CSinusoid 指针的 2D 向量...它是指向此类向量的指针。 C++ [] 操作符对原始指针和向量都有效。因此,函数中的代码将调用指针上的 [x] 运算符并将结果视为 2D 向量,然后在 2D 向量上调用 [y] 运算符并将结果视为 1D 向量。它不知道如何将 CSinusoid* 分配给 CSinusoid*s 的向量,所以它会报错。

    要解决此问题,您可以将 *m_SineMatrix 更改为仅 m_SineMatrix,或将函数更改为 (*m_SineMatrix)[x][y]。

    【讨论】:

      【解决方案2】:

      函数内的代码行是我遇到问题的地方。我不知道如何告诉 2D 矢量中的特定指针指向新对象。

      您的代码已经这样做了。 new 运算符创建一个新对象并立即将向量指向它。

      顺便说一句,你有一个指针向量有什么理由吗?向量已经在堆上分配,因此您可能只想将普通对象放入向量中并以这种方式访问​​它们。不太可能在未来引发麻烦。

      【讨论】:

      • 抱歉,我好像漏掉了一些关键信息。在 Visual Studio 中,相关代码行中的“=”符号带有红色下划线。当我将鼠标悬停在红线上方时,消息显示:“没有运算符”=“匹配这些操作数”。通常任何用红色下划线的东西都表示不正确——你确定我的语法没有问题吗?我有一个指针向量,因为我不知道你刚刚告诉我什么。好电话!
      • 啊,我没注意到m_SineMatrix本身就是一个指针!你应该试试(*m_SineMatrix)[i][j]=new CSinusoid()
      【解决方案3】:

      已编辑

      好的 - 事实证明我遇到的真正问题是我错误地将 2D 向量可视化为对象类型的网格,而实际上它是对象向量的向量。在这种情况下,语法 'vectorName[0][0] =' 直接访问对象,而 'vectorName[0] =' 访问对象的向量,所以基本上我的代码试图说 'thisType = thatType' 而不是说'thisType = thisType'。这就像试图说一个布尔等于一个浮点数,或者类似的东西。这将解释红色下划线的“=”符号。

      以下是一个可行的解决方案:

      std::vector<CSinusoid> vTemp; //Create a vector of object<type>
      CSinusoid Sine; //Create an object of same type
      
      for (int i = 0; i < x; i++)
      {
          vTemp.push_back(Sine); //Add copies of the object to new vector    //A vector of vectors of objects
      std::vector<std::vector<CSinusoid>> m_SineMatrix;
      }
      
      for (int i = 0; i < y; i++)
      {
          m_SineMatrix.push_back(vTemp); //Add copies of that vector to 2D member vector of objects
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 2011-02-11
        • 2013-07-08
        • 2023-03-26
        • 2023-02-09
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多