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
),我不得不质疑是否值得将其作为单独的分配。换句话说,为什么不在结构中放一个整数呢。(此外,由于提问者是初学者,他应该被引导到正确的方向。)