【问题标题】:Pointer dereference causes error when using arrow operator使用箭头运算符时指针取消引用会导致错误
【发布时间】:2021-09-10 13:14:07
【问题描述】:

我正在尝试使用指针(因为我需要它们),但由于某种原因,我不理解它们。 (解释在代码截图下)

void Spiel::SetFigureToField(Figur *figur)
{
    *figur->teampos = *figur->*spieler->GiveTeamPos();
    figur->teampos = figur->spieler->GiveTeamPos();
    figur->pos = figur->teampos;
    this->spielfeld[figur->Startpoint].Figuren.push_back(figur);
    
    std::vector<Figur*>* figs = &figur->spieler->SpawnField;
    for (int i = 0; i < figs.size(); i++) //find figure in spawnfield and erase it
    {
        if (*figs[i] == figur)
        {
            *figs.erase(*figs.begin() + i);
        }
    }

}

struct Figur
{
    Spieler* spieler{};
    int Startpoint{}; //startpoint on spielfeld
    int teampos{0}; //pos in Array | 0 best - 4 worst | 5 spawnfield
    int pos{};
    int id{};

    void reset(int team, int pos)
    {
        if (team == 0) this->Startpoint = 0;
        else this->Startpoint = 21;
        teampos = pos;
    }
};

class Spieler
{
public:
    Spieler(std::string wuerfelS, int team);
    //Stats
    int Wins{ 0 };
    int AnzahlWuerfen{ 0 };
    
    //for game
    int FigursActive{ 0 }; //keepstrack of the figurs on field
    Wuerfel wuerfel{};
    std::vector<Figur>figuren{};
    std::vector<Figur*>SpawnField{};
    Figur* ZielFeldArray[4];

    int GiveTeamPos();
};

好的,第一个函数是我的问题点。

解释它应该如何工作:所以一个Figur(指针)在函数中被传递,它应该被放置到一个gamefield

我的理解:我想编辑figur 中的teampos。所以我学到的是我应该取消引用它(所以我从内存地址中获取值),但如果我这样做 *figur-&gt;teampos 它只会给我一个错误。

另一个:

std::vector<Figur*>* figs = &figur->spieler->SpawnField;

有了这个我应该得到SpawnField向量的指针。我的想法是我必须取消引用它才能使用向量的值和方法。 *figs.size()这是我尝试过的,但它给出了一个错误。

很明显,我不懂指针,但每个教程都说:如果你有一个指针,你必须取消对它的引用才能访问值(好吧是有道理的),但它不起作用

【问题讨论】:

  • 无论“某种原因”是什么,它都很常见。几乎每个人都遇到了指针问题,至少在开始时是这样。
  • 我正在尝试做指针(因为我需要它们), -- 但是你把它发挥到了极致,试图做一些不必是指针的东西变成指针。
  • -&gt;*是一个“取消引用指向成员的指针”运算符,指向成员的指针与指向成员变量的指针不同。 (有趣,不是吗,这个 C++ 的东西?)
  • 您需要备份一个步骤。你说你“不懂指针”,然后说“我正在尝试做指针(因为我需要它们)”。了解指针是能够确定是否需要使用它们的先决条件。此外,您正试图用您不理解的事情向我们解释您试图做的事情……这很可能使您的问题描述对您以外的任何人都是胡言乱语。相反,专注于理解指针(任何关于 C++ 的基本文本都会对此有所帮助)。
  • 要么等待答案(并且可能)接受它,要么写一个全面的答案来帮助其他初学者理解你的问题。

标签: c++ pointers


【解决方案1】:

我正在尝试使用指针(因为我需要它们),但由于某种原因我不理解它们。

如果你不理解它们,你怎么能确定你需要它们?我的意思是这个问题,因为许多程序员,即使是优秀的程序员,都会相信解决方案是最好的,但实际上对问题的误解才是问题的核心。

我的理解:我想在figur 中编辑teampos。所以我学到的是我应该取消引用它(所以我从内存地址中获取值),但如果我这样做 *figur-&gt;teampos 它只会给我一个错误。

C++ 有两个解引用运算符。一元星*ptr 和箭头ptr-&gt;。如果您使用箭头figur-&gt;teampos,那么您已经在此处尊重figurptr-&gt;member 在语义上等同于 (*ptr).member

另一个:std::vector&lt;Figur*&gt;* figs = &amp;figur-&gt;spieler-&gt;SpawnField; 这样我应该得到SpawnField 向量的指针。我的想法是我必须取消引用它才能使用向量的值和方法。 *figs.size()这是我尝试过的,但它给出了一个错误。

要访问向量的成员,您应该使用箭头:figs-&gt;size(),因为星号运算符不能直接访问成员。

索引时也是如此。做vec_ptr[1] 将对指针执行[] 运算符,但应该在向量本身上。你需要(*vec_ptr)[1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2015-01-04
    • 2014-01-12
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多