我是C ++ 11的新手,坦率地说,我在一年多的时间里没有使用过C ++,所以开始时我有点生疏。我正在从我的旧大学文本中做一些练习,并且在尝试迭代char指针字符串时遇到了问题(例如:char * c =“a string”;)。我无法在Google上找到任何有用的信息。我已经习惯了Java,其中foreach循环可以迭代任何集合。我知道指针是如何工作的,但是我从C ++中度过的长假让我对实际使用它们的语法一无所知。有人能告诉我为什么下面的代码(特别是convert()函数)在编译中导致错误,其中“开始”和“结束”未在此范围内声明?
Ex12_01_RomanType.h
#ifndef EX12_01_ROMANTYPE_H
#define EX12_01_ROMANTYPE_H
class RomanType {
public:
RomanType();
RomanType(char * n);
virtual ~RomanType();
char * toString();
int getValue();
private:
char * numeral;
int decimal;
void convert();
};
#endif // EX12_01_ROMANTYPE_H
Ex12_01_RomanType.cpp
#include "Ex12_01_RomanType.h"
RomanType::RomanType() {
// Default Constructor
numeral = "I";
decimal = 0;
convert();
}
RomanType::RomanType(char * n) {
// Specific Constructor
numeral = n;
decimal = 0;
convert();
}
RomanType::~RomanType() {
delete numeral;
}
char * RomanType::toString() {
return numeral;
}
int RomanType::getValue() {
return decimal;
}
void RomanType::convert() {
/* Iterates over each character in the numeral string and adds that
character's value to the decimal value. This method should only
be called once during the constructor. */
for(char c : numeral) {
if(c == 'M') decimal += 1000;
else if(c == 'D') decimal += 500;
else if(c == 'C') decimal += 100;
else if(c == 'L') decimal += 50;
else if(c == 'X') decimal += 10;
else if(c == 'V') decimal += 5;
else if(c == 'I') decimal += 1;
else decimal += 0;
}
}
对不起,如果这个问题对某些人来说是基本的。 Java已经破坏了我。
答案 0 :(得分:7)
基于范围 - for
适用于数组,包含成员begin
和end
的类,或者有适当的非成员begin
和end
}。
你无法找到c
- 样式字符串的“结束”(指向NUL
- 终止char
数组的指针),而不会一直走过它。
最简单的解决方法就是使用std::string
,它可以使用基于范围的for
。
(编辑:现在我想到了,即使你直接使用char
数组也要小心:
const char myString[] = "Hello";
for ( auto c : myString ) //...
因为您将处理数组的所有 6 成员,包括 NUL
- 终止符。虽然你不能在这里做到这一点。)
答案 1 :(得分:1)
Char没有开头或结尾,因此基于范围的for循环不适用于char类型,而是使用较新的std::string
。
答案 2 :(得分:0)
我认为解决问题的最简单方法是使用其范围构造函数std::string(char* begin, char* end)
创建一个字符串,并为其上的每个循环调用一个字符串。
答案 3 :(得分:0)
你已经有了答案。 如果你想用c ++ 11方式做更多的事情,试着用std :: string替换所有的char *。今天的c ++就是如果你能在没有新/删除的情况下完成你的工作,那就先试试吧。
如果您正在使用罗马数字练习,则此链接将使用精美的c ++逐步解释小数到罗马 http://jonjagger.blogspot.fr/2013/07/larry-and-jen-do-roman-numerals-in-c.html