Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修改C++;带int的结构*_C++_Coding Style - Fatal编程技术网

C++ 如何修改C++;带int的结构*

C++ 如何修改C++;带int的结构*,c++,coding-style,C++,Coding Style,我的结构如下: struct CountCarrier { int *CurrCount; }; 这就是我想做的: int main() { CountCarrier carrier = CountCarrier(); *(carrier.CurrCount) = 2; // initialize the *(carrier.CurrCount) to 2 IncreaseCount(&carrier); // should increase the

我的结构如下:

struct CountCarrier
{
    int *CurrCount;
};
这就是我想做的:

int main()
{
    CountCarrier carrier = CountCarrier();
    *(carrier.CurrCount) = 2;  // initialize the *(carrier.CurrCount) to 2
    IncreaseCount(&carrier);  // should increase the *(carrier.CurrCount) to 3
}


void IncreaseCount(CountCarrier *countCarrier)
{
    int *currCounts = countCarrier->CurrCount;
    (*currCounts)++;
}
因此,我的意向已在评论中详细说明

然而,我无法让它工作。对于初学者,程序在此行抛出异常:

*(carrier.CurrCount) = 2;
我怀疑下面这句话也不管用。我做错了什么

    struct CountCarrier 
    {     
        int *CurrCount;  //No memory assigned
    }; 
您需要为结构内的指针分配一些有效内存,以便能够将数据放入其中

除非您这样做,否则您将尝试在某个无效地址写入,这将导致未定义的行为,幸运的是,在本例中,这将显示为异常

分辨率:

    struct CountCarrier 
    {     
        int *CurrCount;  //No memory assigned
        CountCarrier():CurrCount(new(int))
        {

        }
    }; 
建议:
尽可能远离动态分配。
当你想到使用指针时,一定要考虑你是否真的需要指针。在这种情况下,您似乎并不真正需要一个,一个简单的
int
成员就可以了

您需要为结构内的指针分配一些有效内存,以便能够将数据放入其中

除非您这样做,否则您将尝试在某个无效地址写入,这将导致未定义的行为,幸运的是,在本例中,这将显示为异常

分辨率:

    struct CountCarrier 
    {     
        int *CurrCount;  //No memory assigned
        CountCarrier():CurrCount(new(int))
        {

        }
    }; 
建议:
尽可能远离动态分配。

当你想到使用指针时,一定要考虑你是否真的需要指针。在这种情况下,您似乎并不真正需要一个指针,一个简单的
int
成员就可以了。

您需要创建指针。即
carrier->CurrCount=新整数

您需要创建指针。即
carrier->CurrCount=新整数

*(carrier.CurrCount)
这是取消对指针carrier.CurrCount的引用,但您从未初始化它。我怀疑这就是你想要的:

carrier.CurrCount = new int(2);
这是取消对指针carrier.CurrCount的引用,但您从未初始化它。我怀疑这就是你想要的:

carrier.CurrCount = new int(2);

我严重怀疑您的程序是否会在该行引发异常:

*(carrier.CurrCount) = 2;
虽然抛出异常肯定是允许的行为,但更可能的情况是您遇到了导致进程被操作系统终止的访问冲突

问题是您使用的是指针,但您的指针没有初始化为指向任何东西。这意味着指针取消引用的结果未定义


在这种情况下,使用指针似乎没有任何好处。如果您的CurrCount成员只是一个纯整数,那么它也可以正常工作。

我严重怀疑您的程序是否会在该行抛出异常:

*(carrier.CurrCount) = 2;
虽然抛出异常肯定是允许的行为,但更可能的情况是您遇到了导致进程被操作系统终止的访问冲突

问题是您使用的是指针,但您的指针没有初始化为指向任何东西。这意味着指针取消引用的结果未定义

在这种情况下,使用指针似乎没有任何好处。如果CurrCount成员只是一个纯整数,那么它也可以正常工作。

与此一样,您需要为代码提供一些内存

但是为什么要把它弄得这么复杂呢?您不需要为您必须工作的代码提供任何指针。“现代C++方式”更像这样:

struct CountCarrier 
{ 
public:
    CountCarrier(int currCount) : currCount(currCount) {}
    void IncreaseCount() { ++currCount; }
    int GetCount() const { return currCount; }
private:
    int currCount; 
}; 

int main() 
{ 
    CountCarrier carrier(2); // Initialize carrier.currCount to 2 
    carrier.IncreaseCount();  // Increment carrier.currCount to 3
}
注意这是多么的干净和不容易出错。就像我说的,拿起它并通读一遍。

因为,您需要为代码提供一些内存

但是为什么要把它弄得这么复杂呢?您不需要为您必须工作的代码提供任何指针。“现代C++方式”更像这样:

struct CountCarrier 
{ 
public:
    CountCarrier(int currCount) : currCount(currCount) {}
    void IncreaseCount() { ++currCount; }
    int GetCount() const { return currCount; }
private:
    int currCount; 
}; 

int main() 
{ 
    CountCarrier carrier(2); // Initialize carrier.currCount to 2 
    carrier.IncreaseCount();  // Increment carrier.currCount to 3
}

注意这是多么的干净和不容易出错。就像我说的,拿起并阅读它。

< P>如果你使用C++,那么你就应该覆盖它的设施。我不是在更正代码,而是在这里展示代码的外观:

struct CountCarrier
{
  int CurrCount; // simple data member

  CountCarrier(int count) : CurrCount(count) {} // constructor

  CountCarrier& operator ++ ()  // overloaded operator
  {
    ++ CurrCount;
    return *this;
  }
};
我们正在重载
运算符+++
,因为您只有一个数据成员。您还可以用一些命名方法替换,如
void IncrementCount()


如果你使用C++,那么你应该使用它的设施。我不是在更正代码,而是在这里展示代码的外观:

struct CountCarrier
{
  int CurrCount; // simple data member

  CountCarrier(int count) : CurrCount(count) {} // constructor

  CountCarrier& operator ++ ()  // overloaded operator
  {
    ++ CurrCount;
    return *this;
  }
};
我们正在重载
运算符+++
,因为您只有一个数据成员。您还可以用一些命名方法替换,如
void IncrementCount()


它引发异常,因为
CurrCount
未指向有效的内存区域。但这甚至不是代码的最大问题。凯斯:你把
*(carrier.CurrCount)
(*carrier.CurrCount)搞混了。只有后者相当于
carrier->CurrCount
@Idelic:D'oh!你说得对。我已删除注释。它引发异常,因为
CurrCount
未指向有效的内存区域。但这甚至不是代码的最大问题。凯斯:你把
*(carrier.CurrCount)
(*carrier.CurrCount)搞混了。只有后者相当于
carrier->CurrCount
@Idelic:D'oh!你说得对。我已经删除了评论。我还想补充一点:如果你的分配规模如此之小(
newint
),我不得不质疑是否值得将其作为单独的分配。换句话说,为什么不在结构中放一个整数呢。(另外,由于提问者是初学者,他应该被引导到
删除
和智能指针…)我还要补充一点:如果你做的分配大小如此之小(
new int
),我不得不质疑是否值得将其作为单独的分配。换句话说,为什么不在结构中放一个整数呢。(此外,由于提问者是初学者,他应该被引导到正确的方向。)